Несколько слов в защиту heredoc, или практика – лучший критерий истины.

В своем php-коде для определения многострочных строк я обычно прибегаю к heredoc-синтаксису.

Например все sql-запросы в моем php-коде выглядят примерно так:

        $this->query['get'] = <<< EOD
    select o.`id`                        ,
           o.`email`                     ,
           o.`password`                  ,
           o.`login`                     ,
           o.`realname`                  ,
           o.`id_role`                   ,
           o.`log_id`                    ,
           o.`ctime`                     ,
           o.`utime`                     ,
           r.`title`      as `role_title`,
           r.`name`       as `role_name`
      from `users` as o
      join `roles` as r on r.`id_role` = o.`id_role`
    /*WHERE_OPTS*/
    /*ORDER_OPTS*/
    /*LIMIT_OPTS*/
EOD;

Часто можно услышать, что heredoc-синтаксис работает медленнее, чем его коллеги – двойные кавычки. Где написано что он на 20-30% медленнее, где-то что аж в десять раз.

Я решил выяснить действительно ли это так.

Для чего написал небольшой тест (исходники можно скачать тут).

Не буду утомлять Вас подробным приведением листингов, просто расскажу суть.

Мы проверяем 2 тестовых случая:
1. Определение простой строки.
2. Определение строки с вставкой в нее перемененных.

Причем оба случая мы проверяем как для heredoc-синтаксиса, так и для двойных кавычек. Т.е. всего мы получаем четыре варианта определения строк: (простая/с заменой × heredoc/кавычки). Каждый из вариантов мы оформляем в виде функции, которую мы будем вызывать множество раз, а потом сравним результаты.

Ниже представлены результаты 3-х разных запусков теста для 100 000 повторных вызовов наших функций.

Cycle count          : [100 000]
----------------------------------------------------
(no_vars) heredoc FASTER quotes at 0.94% of  0.1900s
(vars   ) heredoc SLOWER quotes at 0.33% of  0.8909s
----------------------------------------------------
Execute time:     2.16 sec

Cycle count          : [100 000]
----------------------------------------------------
(no_vars) heredoc SLOWER quotes at 6.21% of  0.1991s
(vars   ) heredoc SLOWER quotes at 3.25% of  0.9156s
----------------------------------------------------
Execute time:     2.19 sec

Cycle count          : [100 000]
----------------------------------------------------
(no_vars) heredoc FASTER quotes at 4.04% of  0.2022s
(vars   ) heredoc FASTER quotes at 0.08% of  0.9126s
----------------------------------------------------
Execute time:     2.24 sec

Как Вы видите результаты каждый раз разные, когда-то heredoc быстрее кавычек, когда-то медленнее. Отдать предпочтение в быстродействии одному из синтаксисов не представляется возможным.

Какой из всего этого вывод?

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

P.S. Тесты запускались на PHP 5.3.3 в сборке Денвера.

Обсуждение закрыто.