避免在性能关键功能中使用 trycatch

某些 JavaScript 引擎(例如,当前版本的 Node.js 和 Ignition + turbofan 之前的旧版 Chrome)不会在包含 try / catch 块的函数上运行优化程序。

如果需要在性能关键代码中处理异常,在某些情况下将 try / catch 保持在单独的函数中会更快。例如,某些实现不会优化此函数:

function myPerformanceCriticalFunction() {
    try {
        // do complex calculations here
    } catch (e) {
        console.log(e);
    }
}

但是,你可以重构以将慢速代码移动到单独的函数( 可以优化)并从 try 块内部调用它。

// This function can be optimized
function doCalculations() {
    // do complex calculations here
}

// Still not always optimized, but it's not doing much so the performance doesn't matter
function myPerformanceCriticalFunction() {
    try {
        doCalculations();
    } catch (e) {
        console.log(e);
    }
}

这是一个显示差异的 jsPerf 基准: https ://jsperf.com/try-catch-deoptimization。在大多数浏览器的当前版本中,如果有的话应该没有太大区别,但在最新版本的 Chrome 和 Firefox 或 IE 中,在 try / catch 中调用辅助函数的版本可能会更快。

请注意,应该仔细地进行这样的优化,并根据对代码进行概要分析的实际证据。随着 JavaScript 引擎变得更好,它可能最终会损害性能而不是帮助,或者根本没有任何差别(但无缘无故地使代码复杂化)。它是否有帮助,伤害或没有区别可能取决于很多因素,因此请始终衡量对代码的影响。所有优化都是如此,但尤其是依赖于编译器/运行时的低级细节的微优化。