当没有任何异常被抛出时,使用多个try-catch块会使程序变慢吗?我的问题与this one相同,但是针对JavaScript。
假设我有20个函数,它们中都有try-catch块,还有另一个函数调用这20个函数中的每一个而它们都不会抛出异常。这些try-catch块会导致我的代码执行速度变慢或表现更差吗?
当没有任何异常被抛出时,使用多个try-catch块会使程序变慢吗?我的问题与this one相同,但是针对JavaScript。
假设我有20个函数,它们中都有try-catch块,还有另一个函数调用这20个函数中的每一个而它们都不会抛出异常。这些try-catch块会导致我的代码执行速度变慢或表现更差吗?
您是否正在编写典型的CRUD UI代码?使用try catch,使用没有任何原因循环到10000次的循环,甚至使用Angular/Ember-您将不会注意到任何性能问题。
如果您正在进行低级库、物理模拟、游戏、服务器端等操作,则永远不会抛出的try-catch块通常并不重要,但问题在于V8引擎的优化编译器直到版本6才支持它,因此在语法上包含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
不会降低性能,除非调用了一个错误。 - marksyzmlib.foo
函数。永远不会抛出错误。'foo' in lib
检查函数的存在,然后调用该函数。typeof lib['foo'] === 'function'
检查函数的存在,然后调用该函数。Object.prototype.hasOwnProperty.call(lib, 'foo')
检查函数的存在,然后调用该函数。我在Chrome 87上运行了几次基准测试。尽管实际数字会不时变化,但结果是一致的,并且可以粗略地概括如下:
为了澄清,75%较慢意味着如果最快情况需要1.0秒,则较慢的执行需要1.75秒。
总之,在不抛出错误的情况下使用try-catch似乎与检查任何简单条件一样有效。如果条件有更复杂的内容,则try-catch明显更快。 作为个人笔记,结论符合我在大学所学的内容。虽然它是在C ++上下文中,但同样的教训似乎也适用于此处。如果我记得正确,我的讲师说try-block被设计成非常高效,几乎从效率上来看是看不出来的。但是,catch-block很慢,我是真的很慢。如果抛出错误,则使用catch-block进行处理所花费的时间要比使用if-else块花费的时间长数百倍甚至数千倍。因此,请将您的异常保持异常。if ('foo' in lib) {
这一行替换为 if (lib.foo) {
,以防止 in
循环过程中的昂贵操作,虽然只有三个属性(在足够复杂的对象中可能会改变?),但 lib.foo
检查比 in
慢了 79%。对我来说很奇怪。无论如何,是的,基准测试总是真正找到答案的正确方法!感谢您设置一个。 - ruffin'foo' in lib
会检查空值和零吗?还是只针对未定义的情况?只是好奇 :) - st.try-catch
块被认为很耗费性能。然而,如果关键性能不是问题,使用它并不一定是个问题。try-catch
装饰代码会让代码变得丑陋和分散注意力。
不合适:如果你的代码没有异常崩溃的情况,那么插入这样的代码块是不明智的。只有在你期望代码出现故障时才插入它。请查看以下主题:何时使用try/catch块?
异步: try-catch
块是同步的,在异步编程中不起作用。在ajax
请求期间,你可以在专用回调函数中处理error
和success
事件。不需要try-catch
。catch
块中意外抛出错误则不会。使用try/catch和await
相比,通过promise链进行错误处理也有显著的优势,但这超出了本评论的范围。更多信息请参见:https://gist.github.com/mikermcneil/c1028d000cc0cc8bce995a2a82b29245 - mikermcneil