2011-09-10 57 views
15

JavaScript屬性訪問(在當前實現上)的性能特徵是什麼?Javascript大型O屬性訪問性能

  • 假設數組訪問是O(1)是否安全?
  • 如果我使用一個對象作爲哈希表(帶有字符串鍵),我可以安全地假設O(1)或O(log n)的訪問時間?

  • 是否有任何常見的瀏覽器或環境比別人顯着更快/更慢,我應該留意?

  • JavaScript標準有什麼可說的嗎?

而且最重要的是:

  • 我在哪裏可以找到這種漸進的JavaScript性能問題的很好的參考?
+0

了什麼你對自己所做的研究告訴你任何的這些問題? –

+2

我不想做了很多的研究我自己的東西,一個)我可能會得到錯誤的反正和b)很可能已被更多人熟悉的話題,然後我已經做了。 – hugomg

+0

更新:有沒有什麼可以保證一定的時間用於訪問的JavaScript對象的屬性?](http://stackoverflow.com/q/34292087/1048572) – Bergi

回答

6

在JavaScript中的每個對象被實現爲對象的散列,所以沒有功能上的差異。

例如,看看這個測試:作爲位置使用時

var arr = []; 
arr[5] = 5; 
arr['5'] = 'not 5'; 
console.log(arr.length, arr); 
// output: 6 [undefined, undefined, undefined, undefined, undefined, "not 5"] 

數字被字符串化。

有關JavaScript的更多信息,請參閱Crockford's website。在特別重要的部分是標題下的「陣列」:

Arrays in JavaScript are also hashtable objects.

性能是不是一個真正的問題,除非你有一噸的對象跟蹤(如500,000),在這種情況下,你」可能做錯了什麼。

有優化,你可以做,但他們並沒有真正意義,除非你正在做一些不自然的JavaScript(如壓縮算法......我曾在JS的LZMA實現...壞主意)。

注:

如果你有一個備用的一套(像你只定義了10項指標進行10000),你或許應該使用常規的對象。數組將初始化所有10,000個索引爲「未定義」,而Object.keys(obj)將只報告您設置的10個索引。這是一個小小的優化,實際上是有道理的。

+1

我認識的對象和數組的行爲,但我真的很想知道大數字會發生什麼。無論如何,你可能不需要去500000--如果事情變成O(N^2),只需要幾千就足以讓人擔心了。 – hugomg

+2

閱讀鏈接。數組是哈希表。這意味着它可能是O(logn)查找(有很多優化)。我的同事進行了一些測試,發現它不重要,直到你達到5萬以上或其他大的東西。 – tjameson