2017-09-05 44 views
11

簡單的問題:在較深的物體上使用淺物體是否有優點? 當我編寫代碼時,我傾向於使用深度對象,以便易於理解和分類。但我想知道這個習慣是否讓我的代碼變慢。JavaScript中的對象很慢嗎?如果是這樣的話多少

我曾做過一個試驗,但我不知道如果我做正確。

//building necessary objects 
 
var a = {}; 
 
var b; 
 
b = a; 
 
for (var i = 0; i < 100; i++) { 
 
    b["a"] = {}; 
 
    b = b["a"]; 
 
} 
 
var c = {}; 
 

 
//objects used 
 
//a.a.a. ..(101 "a"s).. .a === {} 
 
//c === {} 
 

 
//1st test: shallow 
 
var d; 
 
var start = performance.now(); 
 
for (var i = 0; i < 1000000000; i++) { 
 
    d = c; 
 
    d = null; 
 
} 
 
var end = performance.now(); 
 
console.log('Shallow: ' + (end - start)); 
 

 
//2nd test: deeper 
 
var e; 
 
var start = performance.now(); 
 
for (var i = 0; i < 1000000000; i++) { 
 
    e = a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a; 
 
    e = null; 
 
} 
 
var end = performance.now(); 
 
console.log('Deeper: ' + (end - start));

結果(MS):

shallow 3229 3304 3246 3253 3277 
deep 3375 3343 3247 3193 3248 

的測試時間爲深對象不慢,但有時甚至比淺的速度更快。 儘管如此,我還是沒有足夠的信心得出結論,他們的速度是一樣的。 他們兩個之間有什麼區別嗎?

+0

當然,你是在開玩笑吧?在3秒鐘內完成10億次操作,而你正在嘀咕大約100個操作數?即使是一個人爲的最壞情況?這是過早的優化措施!實施和系統中的差異將大大超過兩者之間性能的小變化。 – RobG

+0

這種類型的速度測試從來沒有真正有用。您測試了一些永遠不會以真實代碼中的方式使用的人工代碼片段,因此js引擎的優化器在此示例中的表現完全不同,然後在真實代碼上表現得完全不同。 –

+0

嵌套的訪問將是一般較慢,但差異太小,無法真正重要的屬性訪問是一個快速'O(1)'操作。注意計算機上的其他因素和過程可能會導致這些較小的時間差異。 –

回答

3
  1. 您正在使用不現實的代碼來測試 「真正的代碼」,這完全是無稽之談
  2. 您使用Date.now(),它是時間戳的近似值,您應該使用performance.now()來測試js速度。目前,即使使用良好的測試代碼,您也會得到錯誤的結果。
  3. JS引擎更新所有的時間。有時候深層物體很慢,在過去的x年裏已經不再是這種情況了。這是一個古老的問題,我甚至無法記住這些年,或者谷歌的任何有價值的東西。
+1

謝謝您的清楚點。 –

+0

我部分想知道的是如果我正確地測試它。 performance.now()看起來好多了。 –

1

它是在JS引擎直接訪問對象的最優化,並允許在一個變量,花費較少的到達時間來兌現深對象。所以訪問它們的速度更快,而無需通過鏈條。 例如:

var a={a:{a:{}}} 
var b=a.a.a 
var c=b 
// is faster than 
var c=a.a.a 

欲瞭解更多信息,請閱讀此:JavaScript Performance: Mutiple variables or one object?

+0

我不確定你在這裏是什麼意思。這似乎沒有回答深嵌套訪問速度有多慢的問題。 –

+0

我編輯它,使之更加清晰 – user7951676

+0

你是說OP需要'a.a.a'的值手動存儲在另一個變量和使用,或者他們的引擎這樣做,並自動緩存的價值?如果您的意思是OP需要執行'b = a.a.a',那麼這更像是一個工作環境,而不是對嵌套對象訪問速度的回答。 –

相關問題