2011-09-10 13 views
15

JavaScript özelliklerinin performans özellikleri nelerdir (mevcut uygulamalarda)?Javascript big-O özellik erişim performansı

  • Dizi erişiminin O (1) olduğunu varsaymak güvenli midir?
  • Bir nesneyi karma tablosu olarak kullanırsam (dize tuşları ile) O (1) veya O (log n) erişim süresini güvenli bir şekilde alabilir miyim?

  • Başkalarına göre önemli ölçüde daha hızlı/daha yavaş olan ve dikkat etmem gereken yaygın tarayıcılar veya ortamlar var mı?

  • JavaScript standartlarının söyleyecek bir şeyi var mı?

Ve en önemlisi:

  • nereden asimptotik JavaScript performans sorunları bu tür iyi referanslar bulabilirim?
+0

Kendi başınıza yaptığınız araştırma size bu soruların herhangi birini anlatıyor mu? –

+2

Kendi başıma çok fazla araştırma yapmak istemiyorum: a) Muhtemelen yine de yanlış anlayacağım ve b) Bu konu hakkında daha önce usta bir kişi tarafından yapılma ihtimali çok yüksektir. – hugomg

+0

Güncelleme: [JavaScript'te bir nesnenin bir özelliğine erişme süresini sabitleyen herhangi bir şey var mı?] (Http://stackoverflow.com/q/34292087/1048572) – Bergi

cevap

6

JavaScript'teki her nesne bir nesne karması olarak uygulanır, dolayısıyla işlevsel bir fark yoktur.

Örneğin, bu testi kontrol: pozisyonlar olarak kullanıldığında

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

Numaraları dizgelenmiş edilir.

Daha fazla bilgi için JavaScript hakkında Crockford's website adresine bakın. Bu durumda,' sen izini (gibi 500,000'den) tutmak için nesnelerin bir ton yoksa

Arrays in JavaScript are also hashtable objects.

Performans gerçekten bir sorun değil: Özellikle önemli parçası başlığı "Dizileri" altında Muhtemelen yanlış bir şey yapıyordur.

Yapabileceğiniz en iyileştirmeler vardır, ancak JavaScript'le doğal olmayan bir şey yapmıyorsanız (sıkıştırma algoritmaları gibi ... JS'de bir LZMA uygulamasında çalıştım ... kötü bir fikir) gerçekten anlam ifade etmiyorlar.

Not:

sen (siz her 10,000 kişiden sadece 10 endeksler tanımlamak gibi) yedek bir set var, muhtemelen normal bir nesne kullanarak olmalıdır. Diziler, tüm 10.000 dizinleri 'tanımsız' olarak başlatacak, Object.keys(obj) ise yalnızca ayarladığınız 10'u rapor edecektir. Bu aslında mantıklı olan küçük bir optimizasyon.

+1

Nesnelerin ve dizilerin nasıl davrandığını biliyorum ama ben Gerçekten büyük sayılar ile ne olduğunu bilmek istiyorum. Muhtemelen 500000'e gitmeniz gerekmeyecektir - eğer bir şey O (N^2) olduğu ortaya çıkarsa, endişelenmeye başlamak için sadece birkaç bin yeterli olacaktır. – hugomg

+2

Bağlantıyı okuyun. Diziler karma masalardır. Bu, aramalar için muhtemelen O (logn) olduğu anlamına gelir (orada birçok optimizasyon var).İş arkadaşım bazı testler yaptı ve 50.000'in üzerinde veya başka bir şey büyük olana kadar önemli olmadığını fark ettim. – tjameson

İlgili konular