【问题标题】:Better way to do simple performance testing进行简单性能测试的更好方法
【发布时间】:2023-03-19 13:39:01
【问题描述】:

在比较操作的性能时,我通常会这样做:

<?php
$w = 'world';
$start1 = microtime(true);
for($i=0;$i<10000;$i++)
    echo 'Hello ' . $w . '!';
$end1 = microtime(true);

$start2 = microtime(true);
for($i=0;$i<10000;$i++)
    echo "Hello $w!";
$end2 = microtime(true);

$start3 = microtime(true);
for($i=0;$i<10000;$i++)
    echo 'Hello ' + $w + '!';
$end3 = microtime(true);

echo "\n\n\n";
echo 'Concatination: ' . ($end1 - $start1) . "\nInline Var: " . ($end2 - $start2) . "\nAddition Operator: " . ($end3 - $start3);

有没有更好的方法来做这些测试,可能是更可靠的方法?似乎如果我多次运行相同的测试,我可以得到截然不同的结果,例如我多次运行上述测试,这就是我得到的。

Concatination: 0.057300090789795
Inline Var: 0.092978954315186
Addition Operator: 0.090532064437866

Concatination: 0.10458517074585
Inline Var: 0.075299978256226
Addition Operator: 0.039528131484985

Concatination: 0.063031911849976
Inline Var: 0.07781195640564
Addition Operator: 0.022316932678223

Concatination: 0.079019069671631
Inline Var: 0.030484914779663
Addition Operator: 0.096056938171387

Concatination: 0.077842950820923
Inline Var: 0.052779912948608
Addition Operator: 0.037421941757202

Concatination: 0.084203004837036
Inline Var: 0.013757944107056
Addition Operator: 0.074331045150757

Concatination: 0.027930021286011
Inline Var: 0.05648398399353
Addition Operator: 0.049610137939453

Concatination: 0.041821956634521
Inline Var: 0.047034978866577
Addition Operator: 0.062538862228394

Concatination: 0.0071420669555664
Inline Var: 0.066315889358521
Addition Operator: 0.004756927490234

Concatination: 0.088988065719604
Inline Var: 0.022722959518433
Addition Operator: 0.06276798248291

正如您在每次运行时看到的那样,结果可能大不相同。

【问题讨论】:

  • 您选择的字符串连接方法与应用程序的性能几乎无关。当您试图从字符串连接中挤出几纳秒的执行时间时,您可能有一个 O(n^3) 嵌套循环,或者在某处运行了 8 秒的未索引查询。另外,您忘记了第 4 种形式:echo 'Hello ', $w, '!';

标签: php benchmarking performance-testing microbenchmark


【解决方案1】:

试试 xdebug,它可以在你的代码运行时分析你的代码,生成一个跟踪文件。然后可以通过 wincachegrind/kcachegrind 或类似工具运行,为您提供有关执行如何执行、花费时间等的详细信息。

Zend 平台还包括一个分析器,如果你有的话。我不记得免费的 Zend Debugger 和/或 Zend Server Community Edition 是否也包含分析器,但如果可以的话,它是分析代码的另一种选择。

就个人而言,我更喜欢 xdebug。

【讨论】:

    最近更新 更多