Дисклеймер: перевод не является буквально дословным равно как и литературным.
print vs echo, which one is faster?
Как и большинство из нас, я устал читать блог-посты про бессмысленные микро-оптимизации типа замены print на echo, ++$I на $i++ или двойные кавычки на одинарные. Почему? Потому, что в 99.999999% случаев это не имеет значения. Почему? Потому, что в 99.99% случаев было бы лучше с вашей стороны если бы вы установили кешер опкода типа APC, или добавили недостающие в вашей базе индексы, или попробовали не делать те 1000 SQL запросов, которые у вас делаются на главной.
Но давайте притворимся, что вы действительно хотите знать ответ на этот вопрос. Вместо того, чтобы пытаться написать скрипт и запустить его миллионы раз, я хочу показать вам инструмент, который может быть полезен тем, что он помогает лучше понять наш php код.
Знакомьтесь — VLD — «Vulcan Logic Disassembler». VLD написан Дериком Ризансом (Derrick Rethans) и, как становится ясно при прочтении главной страницы проекта, «VLD цепляется за Zend Engine и делает дамп всех опкодов выполняемого скрипта».
Установка VLD тривиальна — скачиваете и устанавливаете так же как и любое другое расширение php (привет пользователям M$OS).
phpize $ ./configure $ sudo make install
Подключите расширение в php.ini
extension=vld.so
(ну или в каком нибудь /etc/php/apache2/conf.d/vld.ini — вам виднее где это правильнее сделать в вашей ОС прим. пер.)
Время заглянуть под капот. Создайте два файла: один с echo и другой с print
// print.php <?php print 'foo';
// echo.php <?php echo 'foo';
Запустите эти скрипты из командной строки с параметрами -d vld.activate=1 чтобы активировать VLD вывод и давайте посмотрим на опкод выданный скриптами.
$ php -d vld.active=1 print.php
number of ops: 4 compiled vars: none line # op fetch ext return operands ------------------------------------------------------------------------------- 1 0 PRINT ~0 'foo' 1 FREE ~0 2 2 RETURN 1 3* ZEND_HANDLE_EXCEPTION
—
$ php -d vld.active=1 echo.php
number of ops: 3 compiled vars: none line # op fetch ext return operands ------------------------------------------------------------------------------- 1 0 ECHO 'foo' 2 1 RETURN 1 2* ZEND_HANDLE_EXCEPTION
Нашли отличие? — Да, print использует на один опкод больше, потому, что возвращает что-то. Мы можем заключить, что echo быстрее чем print. Но один опкод ничего не стоит. Правда. Даже если в скрипте сотни вызовов print (вспомни формулу X = E-1 прим. пер.)
Кстати, благодаря тому, что print всегда возвращает 1, вы можете делать интересные штуки типа такой:
// Так нельзя сделать с echo <?php $isFoo and print 'foo'; ?>
Хотите узнать количество опкода выполняемое при запуске скрипта с кучей инклюдов? Попробуйте так:
$ php -d vld.active=1 print.php 2> output $ grep "number of ops" output | cut -f 5 -d ' ' | (tr '\n' +; echo 0) | bc
Я попробовал на голом WordPress. На моем ноутбуке скрипт виснет до тех пор, пока не вываливается с ошибкой «Bus Error», но уже к этому моменту количество опкода зашкаливает за 2.3 миллиона. Этим все сказано.
ссылка на оригинал статьи http://habrahabr.ru/post/211156/
Добавить комментарий