在 php 中尝试捕获的性能

在 php 5 中使用 try-catch 语句时需要考虑哪些性能影响?

我以前在网上读过一些关于这个主题的旧的,似乎相互矛盾的信息。我目前必须使用的很多框架都是在php 4上创建的,并且缺少php 5的许多细节。所以,我自己在php上使用try-catchs方面没有太多经验。


答案 1

需要考虑的一件事是,没有抛出异常的 try 块的成本与实际抛出和捕获异常的成本是不同的问题。

如果只在失败的情况下引发异常,那么您几乎肯定不会关心性能,因为每次执行程序都不会失败很多次。如果你在一个紧密的循环中失败了(又名:用头撞砖墙),你的应用程序可能会有比速度慢更糟糕的问题。因此,不要担心抛出异常的成本,除非您以某种方式被迫将它们用于常规控制流。

有人发布了一个答案,谈论引发异常的分析代码。我自己从未测试过它,但我自信地预测,这将显示出比在不抛出任何东西的情况下进出尝试块更大的性能打击。

另一件需要考虑的事情是,在嵌套调用深度很多级别的地方,一次尝试甚至可以更快......在顶部捕获比检查返回值并在每次调用上传播错误要好。

与这种情况相反,您发现您正在将每个呼叫包装在自己的尝试中...catch块,你的代码会变慢。而且更丑陋。


答案 2

我很无聊,并分析了以下内容(我省略了计时代码):

function no_except($a, $b) { 
    $a += $b;
    return $a;
}
function except($a, $b) { 
    try {
        $a += $b;
    } catch (Exception $e) {}
    return $a;
}

使用两个不同的循环:

echo 'no except with no surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    no_except(5, 7);
}
echo 'no except with surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    try {
        no_except(5, 7);
    } catch (Exception $e) {}
}
echo 'except with no surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    except(5, 7);
}
echo 'except with surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    try {
        except(5, 7);
    } catch (Exception $e) {}
}

在我的WinXP盒子上运行1000000次运行apache和PHP 5.2.6:

no except with no surrounding try = 3.3296
no except with surrounding try = 3.4246
except with no surrounding try = 3.2548
except with surrounding try = 3.2913

这些结果是一致的,无论测试以何种顺序运行,都保持相似的比例。

结论:添加代码来处理罕见的异常并不比忽略异常的代码慢。


推荐