簡體   English   中英

Javascript:為什么我的優化循環比更幼稚的循環慢

[英]Javascript: Why is my optimized loop slower than the more naive one

如果您喜歡jsperf的格式, 鏈接到jsperf: https ://jsperf.com/test-array-vs-loop-vs-loop-optimized

我正在嘗試使用舊的jsperf循環vs過濾器,並且嘗試通過正確分配大小(如果大小正確)並避免重新計算項目長度來優化循環。 問題是它在我的Chrome 60上沒有更快地運行。

這是代碼:

var items = [];
var names = ['george', 'nick', 'jack', 'herodotus', 'joanne'];
for (var i = 0; i < 2000; i++) {
    var obj = {
        name: names[i % 5] + '-' + i,
        age: i % 10 + 15
    };
    items.push(obj);
}

function filter_callback(item) {
    return (item.age == '18');
}

function test_filter() {
    var aged_18_filter = items.filter(filter_callback);
}

function test_loop() {
    var aged_18_loop = [];
    for (var i = 0; i < items.length; i++) {
        if (items[i].age == '18') aged_18_loop.push(items[i]);
    }
}

function test_loop_optimized() {
    var length=items.length
    var aged_18_loop = new Array(length);
    for (var i = 0; i < length; i++) {
        if (items[i].age == '18') aged_18_loop[i]=items[i];
    }
}

編輯:正常循環的結果約為39281 ops / sec,“優化”循環的結果約為37389 ops / sec。 在i7 3610QM上。

我嘗試通過正確分配數組大小來優化循環

但是你失敗了。 過濾結果通常與輸入的大小不同。 通過不附加末尾的數組(使用push )並始終分配給索引i ,您甚至可以創建稀疏數組。 (鑒於您的樣本很小,它至少沒有產生很大的影響)。

正確的方法可能是

function test_loop_optimized() {
    var length = items.length;
    // let's guess that the result will have about a fifth of the size
    var result = new Array(Math.round(length / 5));
    var i = 0;
    var j = 0;
    while (i < length) {
        var item = items[i++];
        if (item.age == '18')
            result[j++] = item;
    }
    result.length = j; // just in case we guessed too high
    return result;
}

…並避免重新計算商品長度

這是JS引擎確實想單獨應用的簡單優化。 實際上,訪問.length並不是真的很慢。 除非發生奇怪的事情,否則您將無法從拼寫中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM