2

下面的示例将在更短的时间内执行 PHP 吗?如果是 A 还是 B?如何正确测试这个?

通过以下方式可以在短时间内加快处理速度:

案例一:

/* -------------------------------------------------
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
------------------------------------------------- */

还是用这个?

案例 B:

/****************************************************
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
*****************************************************/

例如,我使用此代码进行测试:

<?php
echo '<pre>';

$s = microtime(true);
for ($i=0; $i<=10000000; $i++) {
/* -------------------------------------------------

------------------------------------------------- */
}
echo "1: ";
$r1 = microtime(true) - $s;
echo $r1;
echo "\n";

$s2 = microtime(true);
for ($i=0; $i<=10000000; $i++) {
/* -------------------------------------------------
    some information inside commenting rules
------------------------------------------------- */
}
echo "2: ";
$r2 = microtime(true) - $s2;
echo $r2;
echo "\n";

$s3 = microtime(true);
for ($i=0; $i<=10000000; $i++) {
/* -------------------------------------------------
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
------------------------------------------------- */
}
echo "3: ";
$r3 = microtime(true) - $s3;
echo $r3;
echo "\n";


$s4 = microtime(true);
for ($i=0; $i<=10000000; $i++) {
/****************************************************
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
    some information inside commenting rules
*****************************************************/
}
echo "4: ";
$r4 = microtime(true) - $s4;
echo $r4;
echo "\n";

$result = array('1 without text', $r1,
      '2 single line', $r2,
      '3 multiline separator', $r3,
      '4 multiline starred', $r4);

echo min($result);

echo '</pre>';

由于执行和内存操作,结果可能会有所不同。在大多数情况下,我的案例结果是案例 B。

你的结果呢?

4

2 回答 2

1

注释在词法分析时被消除,因此它们的内容是不相关的,尤其是在您上面的基准测试中。

如果一个文件中的两条多行注释的总字节数相同,那么它们对 PHP 的影响将完全相同。较大的评论将需要更多时间来完全处理,然后被丢弃,但我们仍然在谈论词法分析阶段,它是如此之快,以至于您需要一个千兆字节大小的评论而不是几个字节注释以注意差异。

如果您使用操作码缓存(或者只是将 PHP 5.5+ 作为 Apache 模块或 FCGI 运行,现在有一个内置的操作码缓存),您将看到零差异,因为操作码缓存的想法是使词法分析和解析只进行一次。

如果你坚持做一个测试,至少从外面做 - 创建一个文件,内容如下:

<?php
$start = microtime(true);
include 'test.php';
echo microtime(true) - $start;

并将“test.php”替换为您将要测试的任何文件的名称。确保运行每个测试文件几次,因为无论如何差异都微不足道。为了使差异更加明显,您可能希望为该文件生成数百万条评论。这是一个示例生成器:

<?php
$file = '<?php';
for ($i=0; $i<1000000; $i++) {
    $file .= "/* comment */\n";
}
$file .= '?>';
file_put_contents('test.php', $file);

您不应该看到与字节数大致相同的注释有任何统计上的显着差异。

于 2013-08-14T21:18:58.980 回答
1

最终结果: DOCBLOCK获胜。

结果:

比最慢的情况 A 快 8 毫秒。数百万条评论的 Docblocks 大约需要 237 毫秒。

比较:

 CASE     SECONDS:    EXAMPLE CODE:
 A:       0.304       /******************** comment ********************/
 B:       0.343       /*------------------- comment ---------------------*/
 C:       0.293       /*                    comment                    */
 D:       0.237       /**
                       * comment
                       */

 [millions of comments in separated files]

测试结果:

对于案例 A:

/******************** comment ********************/

0.31907296180725
0.31833505630493
0.31972694396973

对于案例 B:

/*------------------- comment ---------------------*/

0.2824490070343
0.28207182884216
0.28176498413086

结果以 ms(毫秒)为单位。我已经订购了执行代码或作为单独的文件加载,结果相同,因此请确保正确测试。

结果:

因此,如果我对一个文件有 100 万条评论,则案例 B 比案例 A 快。案例 B平均 3 毫秒更快。

比案例 B 和 C 更快:

我已经用这个新的进行了测试:

/*                    comment                    */

0.27404689788818
0.27441191673279
0.27490782737732

所以在我的项目中永远不会像 CASE A 或 B 和 C 一样。

最后 D,DOCBLOCK

最后,DOCBLOCK是最快的:

/**
 * comment
 */
[NL]

0.23765897750854
于 2013-08-14T21:58:41.620 回答