簡體   English   中英

JavaScript 的 array.length 的時間復雜度

[英]Time complexity of JavaScript's array.length

在 JavaScript 中調用array.length的時間復雜度是多少? 我認為它會保持不變,因為似乎所有數組上的屬性都是自動設置的,而您只是在查找它?

我認為它會是恆定的,因為似乎所有數組上的屬性都是自動設置的,而您只是在查找它?

對。 這是一個存儲(未計算)並根據需要自動更新的屬性。 該規范在此處此處以及其他地方明確說明了這一點

理論上,只要您無法分辨,JavaScript 引擎就可以自由地計算訪問length ,就好像它是訪問器屬性一樣(這意味着它實際上不能是訪問器屬性,因為您可以在代碼中檢測到它) ),但考慮到length被重復使用很多次for (let n = 0; n < array.length; ++n)浮現在腦海中),我認為我們可以假設所有廣泛使用的 JavaScript 引擎都按照規范執行說或至少是恆定時間訪問的東西。


只是 FWIW:請記住,JavaScript 的標准數組在理論上只是具有特殊行為的對象 理論上,JavaScript 對象是屬性包。 因此,從理論上講,在屬性包中查找屬性可能取決於那里有多少其他屬性,如果該對象是作為某種名稱-> 值哈希圖實現的(而且它們曾經是,回到過去的糟糕時代)。 現代引擎優化對象(Chrome 的 V8 以動態創建動態類並編譯它們而聞名),但對這些對象的操作仍然可以改變屬性查找性能。 例如,添加一個屬性會導致 V8 創建一個子類。 刪除一個屬性(實際上是使用delete )會使 V8 舉手投降並退回到“字典模式”,這大大降低了對對象的屬性訪問。

換句話說:它可能因引擎而異,甚至因對象而異。 但是,如果您純粹將數組用作數組(不在其上存儲其他非數組屬性),則很可能會獲得恆定時間的查找。

這似乎不是瓶頸,但如果您想確保使用var len = arr.length並檢查它。 它不會受到傷害,並且在我的機器上似乎更快一點,盡管沒有顯着差異。

 var arr = []; for (var i = 0; i < 1000000; i++) { arr[i] = Math.random(); } var start = new Date(); for (var i = 0; i < arr.length; i++) { arr[i] = Math.random(); } var time1 = new Date() - start; var start = new Date(); for (var i = 0, len = arr.length; i < len; i++) { arr[i] = Math.random(); } var time2 = new Date() - start; document.getElementById("output").innerHTML = ".length: " + time1 + "<br/>\\nvar len: " + time2;
 <div id="output"></div>

暫無
暫無

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

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