2012-07-06 48 views
4

我正在遍歷一個大數組(10^5項)並對每個數組執行操作。提取函數是否會導致性能損失?

for (var row in rows) { 
    switch (operator) { 
    case "op1": 
     row += 1; 
     break; 
    case "op2": 
     ... 
    case "opN": 
     break; 
    } 
} 

可測性和可讀性,我想內心的switch語句提取到它自己的功能,使循環只是看起來像

for (var row in rows) { 
    this.updateRow(row, operator); 
} 

將與調用函數相關的開銷10^5次會導致顯着的性能損失?

+2

你可以在http://jsperf.com上做你自己的測試 – andlrc 2012-07-06 17:55:33

+1

它可能會,是的。但是隻是測試它......對其進行測試並不難。 – TheZ 2012-07-06 17:55:46

+0

如果您對性能感興趣,如果可能的話,您最好將操作員測試從環路中完全拉出。 (你的示例代碼不會在循環中顯示「操作符」改變。) – Pointy 2012-07-06 17:56:19

回答

2

內聯函數總是會比定義的函數快得多。這是因爲像參數和返回值這樣的東西不需要在運行時從堆棧中推出並彈出。通常這對於較新的機器來說並不是什麼大問題,但通過10^5函數調用,您可以看到性能受到一點影響。

我可能會保持內聯。真的沒有太大的傷害,每一點優化都有幫助!

1

使用JSPerf我異型這裏我的例子:http://jsperf.com/inline-switch-vs-switch-function

我有10萬與4個簡單的算術運算符測試內嵌switch語句對提取到它自己的功能相同的switch語句一個數組項目。我還使用隨機開關操作員,最佳情況操作員(第一個開關選項)和最差情況操作員(最後一個開關選項)對其進行了測試。

內聯開關語句在整個電路板上表現優於功能,在最壞的情況下,功能大約爲150 ops/sec,最佳情況下約爲600 ops/sec。

在這種情況下,內聯switch語句會顯着加快。

相關問題