2016-09-28 102 views
0

當涉及到遍歷所有元素時,會更快嗎?大數組vs較小的對象數組

方法1:

let array = [10, 0, 0, 20, 1, 0, 12, 2, 0]; 

for(let i = 0, l = array.length; i < l; i += 3) { 
    doSomething(array[i], array[i + 1], array[i + 2]); 
} 

VS

方法2:

let array = [{id:10, x:0, y:0}, {id:20, x:1, y:0}, {id:12, x:2, y:0}]; 

for(let i = 0, l = array.length, current = null; i < l; ++i) { 
    current = array[i]; 
    doSomething(current.id, current.x, current.y); 
    // i'm aware that we could make doSomething work with the object 
    // -> even a thing to consider? 
} 

我的猜測是,我們與快,但你們可能有更多的英特爾v8,spidermonkey和所有這些也許是對象的手ling和更小的陣列最終會更快?

+0

爲什麼不使用'Date.now()'來親自看看? – PHPglue

+0

方法1應該更快,但方法2是更好的方式來組織您正在使用的數據。 –

+0

我不認爲訪問對象屬性這種或那種方式會在2016年發生重大變化。我期望兩者在性能方面都做同樣的事情。 – Redu

回答

3

兩者都是O(n)。別的都無所謂。即使他們的內存消耗也只會有所不同。當您認爲這對性能至關重要時,您可以自己做一個基準測試,但it most likely isn't

使用對象,因爲它們爲您的數據提供了一個清晰的結構,使您的代碼更具可讀性。是的,您應該考慮將此類對象傳遞給doSomething

+0

感謝談論內存管理的智慧,我想我會用第二種方式去做,然後@dadykhoff的測試告訴我,它不會在遊戲代碼中至關重要。 – daintycode

0

運行您的兩個方法https://www.measurethat.net/都告訴方法1更快〜2300操作/秒。

https://www.measurethat.net/Benchmarks/ShowResult/1363

+1

「2300 ops/s」是相當無意義的。說片段2的運行速度比片段1慢12%是合理的,但實際上這個基準測試的錯誤就像許多微觀基準一樣。 – Bergi

+0

這是瀏覽器和操作系統也依賴....我在2瀏覽器嘗試,並在 – charlietfl

+1

合理接近嗯感謝您的JSPerf替換。他們在FF v50中獲得了相同的結果,而在Chrome v54中獲得的結果幾乎相同 – Redu