PHP –检查异常速度

为了验证这一点,我将进行一个小型基准测试,以测量配置为抛出异常(一次没有异常)的简单脚本执行时的性能差异。

首先是一个不太有用的脚本来查找奇数(它仅用于基准标记)

error_reporting(-1);
$time = microtime(TRUE);
$mem = memory_get_usage();

$evens = $odds = array();
foreach (range(1, 500000) as $j) {
 try {
 if ($j % 2 != 0) {
 throw new Exception("odd number");
 } else {
 $even[] = $j;
 }
 } catch (Exception $e) {
 $odd[] = $j;
 }
}
echo "evens: " . count($evens) . ", odds " . count($odds);
print_r(array('memory' => (memory_get_usage() - $mem) / (1024 * 1024), 'microtime' => microtime(TRUE) - $time));

现在,相同的愚蠢脚本没有使用异常。

error_reporting(-1);
$time = microtime(TRUE);
$mem = memory_get_usage();

$evens = $odds = array();
foreach (range(1, 500000) as $k) {
 if ($k % 2 != 0) {
 $odds[] = $j;
 } else {
 $evens[] = $j;
 }
}

echo "odds: " . count($odds) . ", evens " . count($evens);
print_r(array('memory' => (memory_get_usage() - $mem) / (1024 * 1024), 'microtime' => microtime(TRUE) - $time));

结果如下:

有异常
内存:15.329871597534微时间
:2.1678985214796
无异常
内存:15.216841537290微时间
:0.2632134548652
正如我们所看到的,内存的利用大致相同。但是事实证明,如果不使用异常,该脚本的速度将提高近十倍。

我已经在具有2048 MB内存和PHP 5.3的PC上使用apache进行了这些测试,
现在我们将使用几乎类似的主机执行测试。这次的配置相同,但是PHP 5.4代替了5.3。

PHP 5.4:

异常
内存:10.574567984512微时间
:0.23456897254687
异常
内存:10.569843616487微时间
:0.10698432145785
我对结果印象深刻。PHP 5.4中的内存使用现在非常高效,并且运行时间也更好(快了将近十倍)。

结果表明,我的结论是,在脚本流中使用异常并没有我想象的那么糟糕。好的,在这个例子中,使用异常不是一个好主意,但是其他异常(如果在复杂脚本中使用)被证明是真正有用的。我还必须考虑超过100,000次迭代时进行的测试,以便对性能差异有一个大致的了解。