Есть ли накладные расходы при использовании комментариев PHP Doc по сравнению с обычными комментариями? - PullRequest
7 голосов
/ 06 октября 2011

Я читал, что когда лексер PHP анализирует php и встречает документ, он сохраняет содержимое этих комментариев в виде метаданных.Таким образом, я бы предположил, что это может привести к небольшим издержкам по сравнению с использованием обычных комментариев в формате без документов?

Обычный комментарий ...

<?php

/*
some text
/*
// more comments

?>

Документ ... ... 1006 *

<?php
/**
 * @author Kenneth Davis
 * @copyright 2011
 * @filename Exception.class.php
*/
?>

Ответы [ 3 ]

4 голосов
/ 06 октября 2011

Единственная ссылка на комментарии PHPDoc как на что-либо кроме игнорируемого текста находится в ReflectionClass::getDocComment().

Я не знаю, означает ли это, что комментарии PHPDoc повлекут за собой какие-либо издержки при обычном разборе, но сомневаюсь, что это все равно имеет значение. Как уже упоминалось выше, такой вид микрооптимизации, скорее всего, мало что даст.

3 голосов
/ 07 октября 2011

Как уже упоминали другие, разница настолько мала, что это не имеет значения.Но чтобы ответить на ваш вопрос, - это разница во времени выполнения.Чтобы проверить это, я сгенерировал два php-файла, каждый с 50000 классами, каждый весом ровно 4288896 байт.

Вот шаблон, который я использовал для версии docblock:

/**
 * My Docblock
 */
class MyClass%s {}

и вот версия без истинного docblock (без двух * в начале, ReflectionClass::getDocComment() не нашел комментарий):

/*-
 * My Docblock
 */
class MyClass%s {}

Полный скрипт для генерации файлов php находится здесь: https://gist.github.com/1268179

Чтобы увидеть какую-либо заметную разницу во времени, мне пришлось каждый раз проходить через php 10 раз , вот так:

time yes docblock.php | head -n 10 | xargs -n 1 php

Вот результат:

с docblocks:

xargs -n 1 php  2.22s user 0.63s system 99% cpu 2.873 total

без docblocks:

xargs -n 1 php  2.16s user 0.63s system 99% cpu 2.813 total

Запуск этого несколько раз, казалось, давал согласованные более быстрые (едва) времена дляверсия docblock.

Подводя итог, можно сказать, что примерно 0,00012 миллисекунды на докблок отслеживает php (если я тут же сделал свою математику).

1 голос
/ 19 марта 2015

Да, есть!

Хотя это может не иметь значения для процессора, оно увеличивает использование памяти, так как доступно из ReflectionClass::getDocComment() вызова, как указано в ответе @Phil.

Начиная с версии php 5.5, с opcache, есть даже возможность отключить документы:

opcache.save_comments = false;

Это может уменьшить использование памяти, но следует предупредить , так как это может сломать некоторые библиотеки, согласно документам php:

Если этот параметр отключен, все комментарии к документации будут отбрасываться из кэша кода операции, чтобы уменьшить размер оптимизированного кода. Отключение этой директивы конфигурации может нарушить работу приложений и платформ, которые полагаются на анализ комментариев для аннотаций, включая Doctrine, Zend Framework 2 и PHPUnit.

Я провел такой же тест, как и в Ответ Адама Вагнера :

С докблоком:

/**
* My Docblock
*/
class MyClass%s {}

MEM: 26,75 МБ ПИК: 29 МБ

С // комментариями:

///
// My Docblock
///
class MyClass%s {}

MEM: 25,25 МБ ПИК: 27,5 МБ

Bu с результатами комментариев в формате 2.4kb более значимы:

MEM: 63 МБ Пик: 101,25 МБ

против

MEM: 25,25 МБ Пик: 63,5 МБ

Генератор тестовых скриптов:

<?php

$template = <<<'T'
/**
 * My Docblock
 */
class MyClass%s {}

T;
$template2 = <<<'T'
///
// My Docblock
///
class MyClass%s {}

T;
$header = <<<'T'
function formatBytes($bytes, $precision = 2) { 
    $units = array('B', 'KB', 'MB', 'GB', 'TB'); 

    $bytes = max($bytes, 0); 
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); 
    $pow = min($pow, count($units) - 1); 

    $bytes /= pow(1024, $pow);

    return round($bytes, $precision) . ' ' . $units[$pow]; 
} 
function show()
{
    echo 'MEM:  ' . formatBytes(memory_get_usage(true)) . PHP_EOL;
    echo 'PEAK: ' . formatBytes(memory_get_peak_usage(true)) . PHP_EOL;
}
T;
$one = "<?php\n$header";
$two = "<?php\n$header";
for($i = 0;$i < 50000;$i++)
{
    $one .= sprintf($template, $i);
    $two .= sprintf($template2, $i);
}
$one .= "show();";
$two .= "show();";

file_put_contents('one.php', $one);
file_put_contents('two.php', $two);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...