某些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引擎变得越来越好,它最终可能会损害性能,而不是提供帮助或完全没有区别(但无缘无故地使代码复杂化)。它是帮助,伤害还是没有影响可以取决于许多因素,因此请始终衡量对代码的影响。所有优化都是如此,尤其是像这样的微优化,它取决于编译器/运行时的低级详细信息。