JavaScript 避免尝试/抓住对性能至关重要的功能

示例

某些JavaScript引擎(例如,Node.jsIgnition + turbofan之前的Chrome的当前版本和较旧版本)无法在包含try / catch块的函数上运行优化器。

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

function myPerformanceCriticalFunction() {
    try {
        // 在这里进行复杂的计算
    } catch (e) {
        console.log(e);
    }
}

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

// 该功能可以优化
function doCalculations() {
    // 在这里进行复杂的计算
}

// 仍未总是进行优化,但是它并没有做太多,因此性能无关紧要
function myPerformanceCriticalFunction() {
    try {
        doCalculations();
    } catch (e) {
        console.log(e);
    }
}

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

请注意,应基于代码概要分析谨慎地进行此类优化,并以实际证据为依据。随着JavaScript引擎变得越来越好,它最终可能会损害性能,而不是提供帮助或完全没有区别(但无缘无故地使代码复杂化)。它是帮助,伤害还是没有影响可以取决于许多因素,因此请始终衡量对代码的影响。所有优化都是如此,尤其是像这样的微优化,它取决于编译器/运行时的低级详细信息。