Давным давно, когда начинал кодить на php, мне говорили, мол не вставляй в кавычки переменные, а делай стандартную конкатенацию, типа быстрей и ошибок меньше будет. Т.е. не делать так: "$a$b$c" а делать так: $a.$b.$c Решил я посмотреть сейчас, так ли оно... Запустил zend, накалякал за минуту такой код: PHP: <?php $b = str_pad(null,1024,'b'); $c = str_pad(null,1024,'c'); $f = microtime(true); for ($i=1; $i<1000000; $i++) $a = $b.$c.$b.$c.$b.$c.$b.$c; print microtime(true)-$f; print "\n"; $f = microtime(true); for ($i=1; $i<1000000; $i++) $a = "$b$c$b$c$b$c$b$c"; print microtime(true)-$f; ?> В первый запуск вывод: 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 часа ночи, ну, взбрендело ^^, так что если где-то ошибся, поправтье.
Если генерировать каждый раз разные значения аргументов, то будет так как Вас и учили PHP: <?php $f = microtime(true); for ($i=1; $i<300000; $i++) { $x=microtime(true); $b=chr(rand(ord('a'),ord('z'))); $c=chr(rand(ord('a'),ord('z'))); $f+=microtime(true)-$x; // Не учитываем время затраченое на генерацию символов $a = $b.$c.$b.$c.$b.$c.$b.$c; } print microtime(true)-$f; print "\n"; $f = microtime(true); for ($i=1; $i<300000; $i++){ $x=microtime(true); $b=chr(rand(ord('a'),ord('z'))); $c=chr(rand(ord('a'),ord('z'))); $f+=microtime(true)-$x; $a = "$b$c$b$c$b$c$b$c"; } print microtime(true)-$f; ?> PHP5
Mavir Код (Text): if(!preg_match("/php5.0|php5.1|php5.1.2|php5.1.5|php5.2/i",$_REQUEST['Mavir'])) echo "Хочу узнать более подробную версию, хотя осознаю, что ядро и все такое... Просто хочу и все...";
А так ли оно? Результат выполнения Вашего скрипта (PHP Version 5.0.3, Zend): 7.8954207897186 6.0247077941895 Опять те же 25% 8) Хотя... Если взять прям из коммандной строки то получаем: Код (Text): C:\Home\local\test>c:/php4/php test.php Content-type: text/html X-Powered-By: PHP/4.3.11 0.134406999999 0.296623 C:\Home\local\test>c:/php5/php test.php 1.58421754837 1.67335271835 Странно все это... Может дебаг Zend'а уделяет больше внимания стандартной конкатенации? Да, версии php: Код (Text): C:\Home\local\test>c:/php4/php -v PHP 4.3.11 (cgi-fcgi) (built: Mar 30 2005 17:34:09) Copyright (c) 1997-2004 The PHP Group Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies C:\Home\local\test>c:/php5/php -v PHP 5.0.5 (cli) (built: Sep 5 2005 15:54:44) Copyright (c) 1997-2004 The PHP Group Zend Engine v2.0.5, Copyright (c) 1998-2004 Zend Technologies ну а в зенде: Код (Text): PHP 5.0.3 (cgi-fcgi) (built: Dec 15 2004 08:07:52) Copyright (c) 1997-2004 The PHP Group Zend Engine v2.0.3, Copyright (c) 1998-2004 Zend Technologies with Zend Debugger v4.0.1, Copyright (c) 1999-2005, by Zend Technologies
Скрипт Mavirа на php5.2: 3.1928796768188 3.264434337616 Конкатенция, как видно, работает быстрее... 2й запуск его же: 3.1818373203278 3.1598653793335 Теперь конкатенция работает медленнее...
почему-то выскакивает МИНУС? Код (Text): gw(440hz):~$>php speed.pgp -0.423381 0.473095 gw(440hz):~$>php -v PHP 4.4.4 with Suhosin-Patch 0.9.5 (cli) (built: Dec 1 2006 13:40:56) Copyright (c) 1997-2004 The PHP Group Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies gw(440hz):~$>cat speed.pgp <?php $b = str_pad(null,1024,'b'); $c = str_pad(null,1024,'c'); $f = microtime(true); for ($i=1; $i<1000000; $i++) $a = $b.$c.$b.$c.$b.$c.$b.$c; print microtime(true)-$f; print "\n"; $f = microtime(true); for ($i=1; $i<1000000; $i++) $a = "$b$c$b$c$b$c$b$c"; print microtime(true)-$f; print "\n"; ?>