2015-09-29 30 views
6

nedir? Ben mülkiyet tüm dizilerde otomatik olarak ayarlanır ve sadece yukarı baktığınız görünüyor beri sabit olacağını düşünüyorum?zaman karmaşıklığı javascript'in .length

+1

, neden endişe verici bir nesne özelliğinin zaman karmaşıklığı nedir? Çok mu az görünüyor? –

cevap

7

Bu özellik, dizinin tüm dizilerde otomatik olarak ayarlandığı ve sürekli olarak baktığınız için sabit olacağını düşünüyorum.

Sağ. Muhtemelen. Depolanan (hesaplanmayan) ve gerektiğinde otomatik olarak güncellenen bir özelliktir.

Bunu söyleyerek,, JavaScript motorlarının, teknik özelliklerin söylediklerinden herhangi bir sapma gözlemleyememeniz koşuluyla, kapakların altında istediklerini yapmakta serbest olduğunu unutmayın. Belirtim, length ...

'un zaman karmaşıklığı hakkında bir şey söylemediğinden, JavaScript'in standart dizilerinin yalnızca teoride objects with special behavior olduğunu unutmayın. Ve , numaralı kuramda, JavaScript nesneleri özellikli çantalardır. Öyleyse, bir mülk torbasında bir mülkün aranması, teoride, nesne, bir tür isim-> değer hashimi olarak uygulandığında (ve eski kötülere geri döndüğünde) kaç tane özelliğin var olduğuna bağlı olabilir.). Modern motorlar nesneleri optimize eder (Chrome'un V8'i sinekte dinamik sınıflar yaratır ve bunları derler), ancak bu nesnelerdeki işlemler hala özellik arama performansını değiştirebilir. Bir özellik eklemek, V8'in bir alt sınıf oluşturmasına neden olabilir. Bir özelliği silmek (aslında delete'u kullanarak) V8'in ellerini kaldırmasını ve nesne üzerinde özellik erişimini önemli ölçüde azaltan "sözlük modu" na geri düşmesini sağlayabilir. Başka bir deyişle: Motor değişebilir, hatta nesneye nesne olabilir. Ancak dizileri yalnızca diziler olarak kullanırsanız (bunlara başka dizisel olmayan özellikler saklamıyorsanız), oranlar sabit zaman aralığına sahip olur.

1

Bir darboğaz gibi görünmüyor, ancak emin olmak istiyorsanız var len = arr.length kullanın ve bunu kontrol edin. Acımak yok ve makinemde biraz daha hızlı görünüyor, önemli bir fark olmasa da. İzin verirseniz

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>

İlgili konular