Является ли heredoc медленнее, чем экранированное эхо в PHP? - PullRequest
1 голос
/ 26 ноября 2011

Я начинаю включать heredocs в свой код из-за описанных здесь преимуществ: В чем преимущество использования Heredoc в PHP?

Мне было интересно, являются ли heredoc медленнее, чем использование echo с escape-символами, особенно когда речь идет о тысячах строк кода и других операциях, таких как запрос к базе данных, файловый ввод-вывод, цикл по коллекции среднего размера и т. Д. (спасибо @delnan). Под «большим» я подразумеваю, достаточно ли проблемы с производительностью, чтобы большинство опытных программистов не использовали ее для больших проектов [например, создание CMS]. Я попытался выполнить тест ниже.

EDIT

Конечно, разница в микросекундах, и приведенный ниже тест не является хорошим примером (я просто пытался выяснить это сам), но мой вопрос не имеет отношения только к повторяющимся строкам.

$echoStmt = "The point of the \"argument\" was to illustrate the use of here documents";

$l = 100;
$start = microtime(TRUE);

while( $l-- ) {
    echo $echoStmt;
}

$end = microtime(TRUE);
$diff = $end - $start;

echo $diff;
// prints 24 microseconds

echo "  |  ";

$l = 100;
$start = microtime(TRUE);

$heredocStmt = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

while( $l-- ) {
    echo $heredocStmt;
}

$end = microtime(TRUE);
$diff = $end - $start;
echo $diff;
// prints 220 microseconds

Ответы [ 6 ]

3 голосов
/ 26 ноября 2011

Если это PHP, то гарантированно есть и другие важные вещи, которые стоит оптимизировать.я бы не потел HEREDOC sttrings ..

2 голосов
/ 26 ноября 2011

Строки анализируются во время компиляции, поэтому то, что тестирует ваш код, - это просто время поиска переменной и ее отображения - не более того.Если вы хотите измерить разницу во времени разбора, вам нужно подключиться к zend_language_scanner - и обнаружите, что нет измеримой разницы.

2 голосов
/ 26 ноября 2011

Посчитайте: микросекунда равна одной миллионной секунды .

Даже с сотнями строк любая разница в производительности (если она действительно есть - см. @ NikiC's и @ Marc'sответы) не имеет значения.Вместо этого используйте любую удобную для чтения, понятную и лучше всего документируемую форму.

В сценарии PHP есть гораздо более дорогие операции, которые действительно стоит оптимизировать - в верхней части списка обычно находятся вызовы базы данных.

2 голосов
/ 26 ноября 2011

Вы в любом случае неправильно используете microtime (), поэтому ваши результаты абсолютно бесполезны / бессмысленны.Когда вы используете голый microtime(), вы получаете СТРОКУ, которая имеет usec sec в формате.Вам нужно использовать microtime(TRUE), чтобы получить истинное число с плавающей запятой, которое вы можете напрямую вычесть.

например, вы можете получить

$start = '999 100'  // 100.999 seconds
$end  = '001 101' // 101.001 seconds

$diff = 001 - 999 = -998 microseconds; // huh?

$start = microtime(TRUE); // 100.999
$end = microtime(TRUE) ; // 101.001;
$diff = 101.001 - 100.999 = 0.002; // proper result.
0 голосов
/ 26 ноября 2011

Я не понимаю, о каких "выгодах" вы говорите.

Каждая выгода в этом ответе - просто обман - парень выбрал худшую возможную альтернативу и сравнил ее с heredoc! И даже в этом случае heredoc стал еще хуже.

На самом деле, все примеры являются более краткими и читаемыми с использованием строк, а не heredoc:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

против

$sql = "select * from $tablename
          where id in [$order_ids_list]
           and product_name = 'widgets'";

или. один лайнер

$x = 'The point of the "argument" was to illustrate the use of here documents';

против 3-х линейных

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

Где эти преимущества?!

Итак, ненужное безобразие heredoc - единственная причина его очень ограниченного использования.

А разница в производительности всегда незначительна.

0 голосов
/ 26 ноября 2011

Если вы используете оптимизатор, такой как eaccelerator, нет абсолютно никакой разницы, поскольку скомпилированная версия документа все равно будет воспринимать обе строки как строки. При составлении сценария разница во времени может составлять миллионную долю секунды, но меня это не сильно волнует.

...