避免在效能關鍵功能中使用 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 引擎變得更好,它可能最終會損害效能而不是幫助,或者根本沒有任何差別(但無緣無故地使程式碼複雜化)。它是否有幫助,傷害或沒有區別可能取決於很多因素,因此請始終衡量對程式碼的影響。所有優化都是如此,但尤其是依賴於編譯器/執行時的低階細節的微優化。