2014-11-23 24 views
0

JavaScript數組過去只是具有某種特殊語法的對象,但JIT引擎可以優化數組,使其具有O(1)訪問而不是O(log n)訪問的真實數組。我目前正在編寫一個cpu密集型循環,我需要一個特定的O(1)訪問而不是O(log n)。但問題是我可能需要在創建數組後立即執行數組[5231] = obj1,但數組最終將被填充。我擔心這種行爲可能會誘使JIT認爲我將它用作稀疏數組,因此我不會獲得我需要的O(1)訪問時間。我的問題是,有什麼方法可以告訴我,或者至少提示我想要一個真正的數組的JavaScript引擎?我需要首先用數組初始化數組嗎?像引用一個虛擬對象一樣填充它(我的數組只包含對同一個原型或未定義的對象的引用)。只需設置array.length = 6000就夠了?JavaScript強制數組的行爲與數組類似

編輯:基於http://jsperf.com/sparse-array-v-true-array,它似乎填充陣列事先是一個好主意。

+2

也許你應該首先使用通用的算法方法編寫程序,然後開始進行微型優化,如果速度不夠快並且分析表明它可能有所幫助。 – Pointy 2014-11-23 02:46:31

+0

那麼,如果你覺得你需要創建和填充一個數組,那麼['Array.prototype.fill()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Array/fill)用於該目的(儘管ECMAScript 6)。 – 2014-11-23 02:47:00

+0

我在問,如果我需要這樣做,而不是如何做到這一點。是的,我已經完成了分析。 – 2014-11-23 02:48:17

回答

0

我意識到我在分析測試中做了很大的改進,因爲它是一個具有不同幀速率的動畫程序,我的分析重點是檢測cpu密集部分的位置。這兩種方法之間的比較並不適合,因爲一種方法只是運行速度較慢,但​​不同函數調用之間的相對CPU時間將相同。無論如何,我寫了一個關於jspref的測試:http://jsperf.com/sparse-array-v-true-array和(除非我犯了一個錯誤,所以,請糾正我!)隨機訪問的數組沒有填充它首先在Chrome和Firefox中運行速度比填充版本慢兩倍。所以,如果你正在寫空間散列圖這樣的東西,那麼首先填寫它是個好主意。