使用PHP Doc评论和常规评论会有开销吗?

时间:2011-10-05 23:23:51

标签: php comments micro-optimization

我读到当PHP lexer解析php并遇到doccomment时,它将该注释的内容存储为元数据。所以我认为与使用非doccomment格式的常规注释相比,这可能会有轻微的开销?

定期评论......

<?php

/*
some text
/*
// more comments

?>

... doccomment

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

3 个答案:

答案 0 :(得分:4)

除了忽略文本以外,对PHPDoc注释的唯一引用是ReflectionClass::getDocComment()

我不知道这是否意味着PHPDoc注释会在正常解析过程中产生任何开销,但无论如何它都会产生任何不同。正如哈拉尔德在上面提到的那样,这种微观优化可能几乎没有差别。

答案 1 :(得分:3)

正如其他人所说,差异很小,无关紧要。但要回答你的问题, 是运行时的差异。为了测试这个,我生成了两个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版本。

总而言之,这是php保存的每个docblock大约0.00012毫秒 跟踪(如果我在那里做了我的数学)。

答案 2 :(得分:1)

是的!

虽然它可能不会使cpu产生差异,但会增加内存使用量,因为它可以从ReflectionClass::getDocComment()调用获得,如@Phil回答中所指出的那样。

从php 5.5版本开始,使用opcache,甚至可以选择禁用doccomments:

opcache.save_comments = false;

这可能会减少内存使用量,但会被警告,因为它可能会破坏某些库,如php docs所述:

如果禁用,则将从操作码缓存中丢弃所有文档注释,以减小优化代码的大小。禁用此配置指令可能会破坏依赖注释解析注释的应用程序和框架,包括Doctrine,Zend Framework 2和PHPUnit。

我在Adam Wagner's回答中做了类似的测试:

使用docblock:

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

MEM: 26.75 MB 峰值: 29 MB

//评论:

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

MEM: 25.25 MB 峰值: 27.5 MB

Bu与2.4kb文档评论结果更有意义:

MEM: 63 MB 峰值: 101.25 MB

VS

MEM: 25.25 MB 峰值: 63.5 MB

测试脚本生成器:

<?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);