在Javascript中,即使从未抛出异常,使用try-catch块的代价是否高昂?
在没有抛出异常的情况下,使用几个try-catch块是否“缓慢”?我的问题与相同,但针对JavaScript在Javascript中,即使从未抛出异常,使用try-catch块的代价是否高昂?,javascript,performance,exception,try-catch,Javascript,Performance,Exception,Try Catch,在没有抛出异常的情况下,使用几个try-catch块是否“缓慢”?我的问题与相同,但针对JavaScript 假设我有20个函数,其中包含try-catch块,另一个函数调用这20个函数中的每一个,其中没有一个抛出异常。我的代码会因为这个try-catch块而执行得更慢还是执行得更差?据说try-catch块很昂贵。但是,如果关键性能不是一个问题,那么使用它不一定是一个问题 国际海事组织的处罚是: 可读性 在许多情况下是不合适的 在异步编程方面无效 可读性:用大量的try-catch编写代码
假设我有20个函数,其中包含try-catch块,另一个函数调用这20个函数中的每一个,其中没有一个抛出异常。我的代码会因为这个try-catch块而执行得更慢还是执行得更差?据说try-catch块很昂贵。但是,如果关键性能不是一个问题,那么使用它不一定是一个问题 国际海事组织的处罚是:
- 可读性
- 在许多情况下是不合适的
- 在异步编程方面无效
try-catch
块是同步的,在Async
编程时无效。在ajax
请求期间,您可以在专用回调中处理错误
和成功
事件。不需要尝试catch
希望这有帮助
R.您正在编写典型的CRUD UI代码吗?使用try-catch,使用在代码中无缘无故地散布到10000的循环,见鬼,使用angular/ember-您不会注意到任何性能问题 如果你在做低级库、物理模拟、游戏、服务器端等,那么从不抛出try-catch块通常根本不重要,但问题是直到引擎版本6,V8才在优化编译器中支持它,因此,语法上包含try-catch的整个包含函数将不会得到优化。不过,您可以通过创建类似于
tryCatch
的辅助函数轻松解决此问题:
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保护代码块时,肯定会产生影响,但是try/catch的影响会很快消失,因为被保护的代码甚至变得稍微复杂
考虑这个测试:
一个简单的增量以每秒356800000次迭代的速度运行
try/catch中的相同增量为每秒93500000次迭代。这是由于try/catch造成的75%的开销。
但是,一个微不足道的函数调用以每秒112200000次迭代的速度运行。
2个普通函数调用以每秒61300000次迭代的速度运行
在这个测试中,一次未执行的尝试所花费的时间比一次简单的函数调用稍多。这几乎不是一个重要的速度惩罚,除了在像FFT这样非常激烈的东西的最内部循环中
您希望避免的情况是实际引发异常的情况。如上面的链接所示,速度要慢得多
编辑:这些数字是我机器上Chrome的。在Firefox中,未经授权的尝试和完全没有保护之间没有显著区别。如果没有抛出异常,使用try/catch基本上是零惩罚。我试图根据具体的基准测试结果提供答案。为此,我编写了一个简单的基准测试,将try-catch与各种if-else条件进行比较,从简单到更复杂。我知道,根据平台的不同,基准可能会有很大的变化。如果您得到不同的结果,请发表评论。看 首先,我尝试在这里以紧凑的方式表示测试套件。有关详细信息,请参见上面的链接。有四个测试用例,稍后由(索引)引用:
- (1) 尝试调用函数
的catch块,并使用一些三角数学。不会抛出任何错误lib.foo
- (2) if-else块,通过lib中的'foo'检查函数是否存在,然后调用函数
- (3) if-else块,通过
检查函数是否存在,然后调用函数typeof lib['foo']=='function'
- (4) if else块,通过
检查函数是否存在,然后调用函数Object.prototype.hasOwnProperty.call(lib,'foo')
- try-catch(1)和if-else(2)在运行时几乎相等。试捕(2)有时会慢1%到2%
- if-else(3)比try-catch(1)或if-else(2)慢75%
- if-else(4)比try-catch(1)或if-else(2)慢90%