За последние 24 часа нас посетили 18379 программистов и 1605 роботов. Сейчас ищут 938 программистов ...

Алгоритм операций сравнения

Тема в разделе "Прочие вопросы по PHP", создана пользователем freeneutron, 29 сен 2010.

  1. freeneutron

    freeneutron Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Хочу уточнить, как работают операции == и ===. Вопрос такой. Прежде чем начать перебирать содержимое сравниваемых объектов, проверяют ли эти операции то, являются ли сравниваемые объекты ссылками на один и тот же объект?

    В случае отрицательного ответа, такой еще вопрос. Есть ли в PHP операция проверки того, являются ли два объекта ссылками на один и тот же объект?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А проверить?
    PHP:
    1. <?
    2. class a {
    3.     var $v = 1;
    4. }
    5. class b {
    6.     var $v = 1;
    7. }
    8. $a = new a();
    9. $a2 = new a();
    10. $b = new b();
    11. $b2 = new b();
    12. var_dump($a == $a2);
    13. var_dump($a == $b);
    14. var_dump($b == $b2);
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
     
  4. freeneutron

    freeneutron Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Запустил такой тест:
    HTML:
    1. <?php
    2. $count=40;
    3. $i1=$i2=$i3=0;
    4.  
    5. for($i1=0;$i1<$count;$i1++)     //Задаем несколько измерений,
    6. for($i2=0;$i2<$count;$i2++)     //что бы проверить, как их количество
    7. for($i3=0;$i3<$count;$i3++)     //влияет на скорость сравнения
    8.     $a[$i1][$i2][$i3]="$i1-$i2-$i3";
    9. for($i1=0;$i1<$count;$i1++)
    10.     $b[$i1]=&$a[$i1];           //Создаем массив ссылок
    11.  
    12. $t1=microtime(1);
    13. for($i1=0;$i1<$count;$i1++)
    14. for($i2=0;$i2<$count;$i2++)
    15.     $b[$i1]===$b[$i2];          //Сравниваем разные ссылки
    16. $t2=microtime(1)-$t1;
    17. echo"time 1: $t2\n";            //Выводим затраченное время 1
    18.  
    19. $t1=microtime(1);
    20. for($i1=0;$i1<$count;$i1++)
    21. for($i2=0;$i2<$count;$i2++)
    22.     $b[$i2]===$b[$i2];          //Сравниваем одинаковые ссылки
    23. $t2=microtime(1)-$t1;
    24. echo"time 2: $t2\n";            //Выводим затраченное время 2
    25.  
    Суть теста в том, что сравниваются элементы массива $b, являющиеся, в свою очередь, ссылками на другие массивы. Первый раз сравниваем каждый элемент с каждым, второй раз - каждый элемент с самим собой. Вот результат теста:
    Код (Text):
    1. для операции == :
    2. time 1: 0.03262996673584
    3. time 2: 1.4667098522186
    4. для операции === :
    5. time 1: 0.021275043487549
    6. time 2: 0.74690508842468
    Он говорит о том, что операции сравнения не позволяют сэкономить время на сравнении объекта с самим собой и для достижения соответствующей экономии нужно исхитряться и придумывать что-то свое. Альтернативных функций сравнения, на сколько я понимаю, в PHP нет.
     
  5. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Вы определитесь, вам объекты или массивы.
     
  6. freeneutron

    freeneutron Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Не сразу понял намека, но завернув ссылку на массив в объект получил не плохой результат
    Код (Text):
    1. time 1: 0.0055010318756104
    2. time 2: 0.0036649703979492
    Интересно, какие еще операции можно ускорить таким способом?
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну просто операции сравнения объектов специфичны, о чем и написано в документации. И в общем ясно почему- передача объекта по ссылке - это стандартное поведение, так что и сравнение это должно учитывать.
    А сравнение других типов... ну там ссылки не часто бывают, весьма специфичная задача/тест... возможно никто не парился. Хотя, конечно же, можно было бы оптимизировать это дело.