За последние 24 часа нас посетили 59804 программиста и 1774 робота. Сейчас ищут 849 программистов ...

Интересный случай...

Тема в разделе "Прочие вопросы по PHP", создана пользователем Vixim, 2 дек 2006.

  1. Vixim

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

    С нами с:
    2 дек 2006
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Russia
    Давным давно, когда начинал кодить на php, мне говорили, мол не вставляй в кавычки переменные, а делай стандартную конкатенацию, типа быстрей и ошибок меньше будет.

    Т.е. не делать так: "$a$b$c"
    а делать так: $a.$b.$c

    Решил я посмотреть сейчас, так ли оно...
    Запустил zend, накалякал за минуту такой код:

    PHP:
    1. <?php
    2. $b = str_pad(null,1024,'b');
    3. $c = str_pad(null,1024,'c');
    4.  
    5. $f = microtime(true);
    6. for ($i=1; $i<1000000; $i++) $a = $b.$c.$b.$c.$b.$c.$b.$c;
    7. print microtime(true)-$f;
    8.  
    9. print "\n";
    10.  
    11. $f = microtime(true);
    12. for ($i=1; $i<1000000; $i++) $a = "$b$c$b$c$b$c$b$c";
    13. print microtime(true)-$f;
    14. ?>
    15.  
    В первый запуск вывод:
    19.033681154251
    14.632913827896

    Удивился... Стандартная конкатенация работает медленней почти на 25% чем если внутри составлять!
    Подумал может php что-то умное сделал в отимизации, все таки итерация и одна и та же операция.
    Решил поменять подсчеты местами, т.е. "$b$c$b$c$b$c$b$c" и $b.$c.$b.$c.$b.$c.$b.$c

    Запускаю, результат:
    10.772908210754
    14.214095115662

    Опять те же 25%!!!
    Все фоновые процессы поубивал.

    Вывод: видать наоборот лучше НЕ использовать стандартную конкатенацию а вставлять переменные прям в кавычки.

    Кто не согласен и может опровергуть - пожалуйста, интересно может у кого-нибудь все с точностью до наоборот?
    Я знаю, тайна таится в сорцах PHP, но леееень.... леееень лезть туда...

    PS: делал я это все в 2 часа ночи, ну, взбрендело ^^, так что если где-то ошибся, поправтье.
     
  2. Davil

    Davil Guest

    Vixim интересный эксперимент. Можно ли узнать версию интерпретатора, на которой проводился тест?
     
  3. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    В одном случае удобно одно, в другом другое. Разница в микросекундах.
    Оптимизировать нужно алгоритм.
     
  4. Mavir

    Mavir Guest

    Если генерировать каждый раз разные значения аргументов, то будет так как Вас и учили :)
    PHP:
    1. <?php
    2.  
    3. $f = microtime(true);
    4. for ($i=1; $i<300000; $i++) {
    5.   $x=microtime(true);
    6.   $b=chr(rand(ord('a'),ord('z')));
    7.   $c=chr(rand(ord('a'),ord('z')));
    8.   $f+=microtime(true)-$x; // Не учитываем время затраченое на генерацию символов
    9.  
    10.   $a = $b.$c.$b.$c.$b.$c.$b.$c;
    11. }
    12. print microtime(true)-$f;
    13.  
    14. print "\n";
    15.  
    16. $f = microtime(true);
    17. for ($i=1; $i<300000; $i++){
    18.   $x=microtime(true);
    19.   $b=chr(rand(ord('a'),ord('z')));
    20.   $c=chr(rand(ord('a'),ord('z')));
    21.   $f+=microtime(true)-$x;
    22.  
    23.   $a = "$b$c$b$c$b$c$b$c";
    24. }
    25. print microtime(true)-$f;
    26. ?>
    PHP5
     
  5. Davil

    Davil Guest

    Mavir
    Код (Text):
    1. if(!preg_match("/php5.0|php5.1|php5.1.2|php5.1.5|php5.2/i",$_REQUEST['Mavir']))
    2.   echo "Хочу узнать более подробную версию, хотя осознаю, что ядро и все такое... Просто хочу и все...";
     
  6. Vixim

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

    С нами с:
    2 дек 2006
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Russia
    А так ли оно? :)

    Результат выполнения Вашего скрипта (PHP Version 5.0.3, Zend):
    7.8954207897186
    6.0247077941895

    :)

    Опять те же 25% 8)

    Хотя... Если взять прям из коммандной строки то получаем:
    Код (Text):
    1.  
    2. C:\Home\local\test>c:/php4/php test.php
    3. Content-type: text/html
    4. X-Powered-By: PHP/4.3.11
    5.  
    6. 0.134406999999
    7. 0.296623
    8.  
    9. C:\Home\local\test>c:/php5/php test.php
    10. 1.58421754837
    11. 1.67335271835
    Странно все это... Может дебаг Zend'а уделяет больше внимания стандартной конкатенации?

    Да, версии php:
    Код (Text):
    1. C:\Home\local\test>c:/php4/php -v
    2. PHP 4.3.11 (cgi-fcgi) (built: Mar 30 2005 17:34:09)
    3. Copyright (c) 1997-2004 The PHP Group
    4. Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    5.  
    6. C:\Home\local\test>c:/php5/php -v
    7. PHP 5.0.5 (cli) (built: Sep  5 2005 15:54:44)
    8. Copyright (c) 1997-2004 The PHP Group
    9. Zend Engine v2.0.5, Copyright (c) 1998-2004 Zend Technologies
    ну а в зенде:
    Код (Text):
    1. PHP 5.0.3 (cgi-fcgi) (built: Dec 15 2004 08:07:52)
    2. Copyright (c) 1997-2004 The PHP Group
    3. Zend Engine v2.0.3, Copyright (c) 1998-2004 Zend Technologies
    4.     with Zend Debugger v4.0.1, Copyright (c) 1999-2005, by Zend Technologies
     
  7. Davil

    Davil Guest

    Скрипт Mavirа на php5.2:

    3.1928796768188
    3.264434337616

    Конкатенция, как видно, работает быстрее...

    2й запуск его же:

    3.1818373203278
    3.1598653793335
    Теперь конкатенция работает медленнее...
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    почему-то выскакивает МИНУС?

    Код (Text):
    1.  
    2. gw(440hz):~$>php speed.pgp
    3. -0.423381
    4. 0.473095
    5. gw(440hz):~$>php -v
    6. PHP 4.4.4 with Suhosin-Patch 0.9.5 (cli) (built: Dec  1 2006 13:40:56)
    7. Copyright (c) 1997-2004 The PHP Group
    8. Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    9. gw(440hz):~$>cat speed.pgp
    10. <?php
    11. $b = str_pad(null,1024,'b');
    12. $c = str_pad(null,1024,'c');
    13.  
    14. $f = microtime(true);
    15. for ($i=1; $i<1000000; $i++) $a = $b.$c.$b.$c.$b.$c.$b.$c;
    16. print microtime(true)-$f;
    17.  
    18. print "\n";
    19.  
    20. $f = microtime(true);
    21. for ($i=1; $i<1000000; $i++) $a = "$b$c$b$c$b$c$b$c";
    22. print microtime(true)-$f;
    23.  
    24. print "\n";
    25. ?>