- PVSM.RU - https://www.pvsm.ru -

print или echo, что быстрее?

Под катом перевод довольно старого поста Фабиена (Fabien Potencier) на тему print vs echo, примечательного, на мой взгляд, методом установления «истинны». В отличии от подавляющего большинства подобных исследований, в этом вы не найдете запуска скриптов с echo и print миллионы раз.

Дисклеймер: перевод не является буквально дословным равно как и литературным.

print vs echo, which one is faster?

Как большинство из нас, я устал читать блог-посты про бессмысленные микро-оптимизации типа замены print на echo, ++$I на $i++ или двойные кавычки на одинарные. Почему? Потому что в 99.999999% случаев, это не имеет значения. Почему? Потому что в 99.99% случаев было бы лучше с вашей стороны, если бы вы установили кешер опкода типа APC, или добавили недостающие в вашей базе индексы, или попробовали не делать те 1000 SQL запросов, которые у вас делаются на главной.

Но давайте притворимся, что вы действительно хотите знать ответ на этот вопрос. Вместо того, чтобы пытаться написать скрипт и запустить его миллионы раз, я хочу показать вам инструмент, который может быть полезен тем, что он помогает лучше понять наш php код.

Знакомьтесь — VLD [1] — «Vulcan Logic Disassembler». VLD написан Дериком Ризансом (Derrick Rethans [2]) и, как становится ясно при прочтении главной страницы проекта, «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 миллиона. Этим все сказано.

Автор: FrEEz10

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/54103

Ссылки в тексте:

[1] VLD: http://derickrethans.nl/vld.php

[2] Derrick Rethans: http://derickrethans.nl/

[3] Источник: http://habrahabr.ru/post/211156/