关于性能:在Javascript中,即使从不抛出异常,使用try-catch块也是昂贵的吗?

In Javascript, is it expensive to use try-catch blocks even if an exception is never thrown?

当没有任何异常被抛出时,使用多个try-catch块"慢"吗?我的问题和这个问题一样,但对于javascript。

假设我有20个函数,其中有try catch块。另一个函数调用这20个函数中的每一个。他们都不会抛出异常。由于这个try-catch块,我的代码执行速度会变慢还是执行得更差?


您在执行典型的CRUD UI代码吗?使用Try-Catch,使用毫无理由地散布在代码中的10000个循环,hell,使用angular/ember-您不会注意到任何性能问题。

如果您正在执行低级库、物理模拟、游戏、服务器端等,那么从不抛出的try-catch块通常根本不重要,但问题是V8在引擎的版本6之前在其优化编译器中不支持它,因此语法上包含try-catch的整个包含函数将不会是最佳的。零能耗。但是,通过创建一个类似于tryCatch的助手函数,您可以轻松地解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function tryCatch(fun) {
    try {
        return fun();
    }
    catch(e) {
        tryCatch.errorObj.e = e;
        return tryCatch.errorObj;
    }
}
tryCatch.errorObj = {e: null};


var result = tryCatch(someFunctionThatCouldThrow);
if(result === tryCatch.errorObj) {
    //The function threw
    var e = result.e;
}
else {
    //result is the returned value
}

在V8版本6(与node 8.3和最新的chrome一起提供)之后,try-catch中代码的性能与普通代码相同。


最初的问题是在没有抛出错误时,有关尝试/捕获的成本。当用try/catch保护代码块时,肯定会有影响,但是,当受保护的代码变得更加复杂时,try/catch的影响将很快消失。

考虑这个测试:http://jspef.com/try-catch-performance-jls/2

一个简单的增量以每秒356800000次迭代的速度运行Try/Catch中的相同增量是每秒93500000次迭代。这是75%的开销,因为尝试/捕获。但是,一个普通的函数调用以每秒112200000次迭代的速度运行。2个普通函数调用以每秒61300000次迭代的速度运行。

在这个测试中,一次未执行的尝试比一个简单的函数调用花费的时间稍微多一些。这几乎不是一个速度惩罚,除了在像快速傅立叶变换这样非常激烈的东西的最内部的循环。

您要避免的情况是实际抛出异常的情况。这是非常慢,如上面的链接所示。

编辑:这些数字是我的机器上的铬。在火狐中,未执行的尝试和完全没有保护之间没有显著的区别。如果没有抛出异常,那么使用try/catch基本上是零惩罚。


据说try-catch区块价格昂贵。但是,如果关键性能不是一个问题,那么使用它就不一定是一个问题。

IMO的处罚是:

  • 可读性
  • 在许多情况下不合适
  • 异步编程无效

可读性:用大量的try-catch给代码添加管道是丑陋和分散注意力的。

不适当:如果代码不受异常崩溃的影响,插入这样的块是一个坏主意。只有在代码中出现故障时才插入它。请看以下主题:何时使用try/catch块?

异步:try-catch块是同步的,在async编程时无效。在ajax请求期间,您在专用回调中处理errorsuccess事件。不需要try-catch

希望这有帮助,

R.