我读到当PHP lexer解析php并遇到doccomment时,它将该注释的内容存储为元数据。所以我认为与使用非doccomment格式的常规注释相比,这可能会有轻微的开销?
定期评论......
<?php
/*
some text
/*
// more comments
?>
... doccomment
<?php
/**
* @author Kenneth Davis
* @copyright 2011
* @filename Exception.class.php
*/
?>
答案 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);