簡體   English   中英

為什么for-in的javascript速度很慢?

[英]Why is for-in slow in javascript?

我已經在很多地方讀到了for-in循環比循環遍歷數組要慢...盡管我了解到,與在場景背后進行迭代以遍歷對象的鍵相比,在sizeof(type)塊中前進實際上是毫不費力的,我仍然很好奇,確切的原因是這么慢...

是否必須執行反向哈希函數才能獲取密鑰,而這個過程很慢?

對於任何特定引擎,對此的真正答案很可能取決於該引擎的實現。 (如果有的話,差異的大小也會如此。)

但是,有不變量。 例如,考慮:

var obj = {a: "alpha", b: "beta"};
var name;
for (name in obj) {
    console.log(obj[name]);
}

var arr = ["alpha", "beta"];
var index;
for (index = 0; index < arr.length; ++index) {
    console.log(arr[index]);
}

對於obj ,引擎必須使用一種機制來跟蹤已迭代的屬性和尚未迭代的屬性,並過濾掉不可枚舉的屬性。 例如,幕后有某種迭代器對象(以及規范的定義方式,很可能是一個臨時數組)。

arr的情況下,它不是; 您可以以非常簡單,有效的方式在代碼中進行處理。

每個循環的塊內容相同:在對象上進行屬性查找。 (在后一種情況下,理論上也有數字到字符串的轉換。)

因此,我希望對此的唯一非特定於實現的答案是:額外的開銷。

for..each循環使用迭代器生成器

迭代器是具有next()方法的對象。 Generator是一個包含yield()表達式的工廠函數。 兩種構造都比整數索引變量復雜。

在典型的for(var i = 0; i < arr.length; i++)循環中,幾乎在所有迭代中執行的兩個命令是i++i < arr 可以說這比進行函數調用( next()yield() )快得多。

此外,循環啟動( var i = 0 )也比使用next()方法創建迭代器對象或調用生成器創建迭代器要快。 但是,它高度依賴於實現,並且Javascript引擎的創建者會盡最大努力來加速這種常用的語言功能。

我會說這種差異非常小,以至於我可能想花時間優化代碼的其他部分。 語法的選擇應該考慮代碼的可讀性和可維護性,而不是性能,這是因為性能增益太小而增加復雜性。 話雖如此,請使用對您和其他在您變得富有和出名之后維護代碼的開發人員來說更有意義的語法! ;)

暫無
暫無

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

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