为了验证这一点,我将进行一个小型基准测试,以测量配置为抛出异常(一次没有异常)的简单脚本执行时的性能差异。
首先是一个不太有用的脚本来查找奇数(它仅用于基准标记)
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次迭代时进行的测试,以便对性能差异有一个大致的了解。