Soru JavaScript nesnesinde anahtar aramanın performansı


Sadece şu soruyu okudum: Javascript'te python gibi sözlükler var mı?

Cevaplardan biri, Python sözlükleri gibi JavaScript nesnelerini kullanabileceğinizi söyledi. Bu doğru mu? Bir nesnede anahtar aramanın performansı nedir? O (1) mi? Nesneye bir anahtar eklemek de sabit zaman (hashing) mi?


41
2017-10-09 02:07


Menşei




Cevaplar:


V8 tasarım belgeleri Daha hızlı değilse, ima aramaları en azından bu kadar hızlı olacaktır:

Çoğu JavaScript motoru, sözlük benzeri bir veri yapısı kullanır.   nesne özellikleri için depolama - her bir mülk erişimi   Mülkiyetin bellekte yerini çözmek için dinamik arama. Bu   yaklaşım, genellikle JavaScript’teki özelliklerin erişimini kolaylaştırır   programlama dillerindeki örnek değişkenlere erişmekten daha yavaş   Java ve Smalltalk. Bu dillerde, örnek değişkenler bulunur   Sabit nesne nedeniyle derleyici tarafından belirlenen sabit uzaklıklarda   nesnenin sınıf tarafından tanımlanan düzen. Erişim sadece bir meseledir   Hafıza yükü veya deposu, genellikle sadece tek bir talimat gerektirir.

JavaScript özelliklerine erişmek için gereken süreyi azaltmak için V8   özelliklere erişmek için dinamik arama kullanmayın. Bunun yerine, dinamik olarak V8   perde arkasında gizli sınıflar oluşturur. [...] V8'de bir nesne değişir   Yeni bir özellik eklendiğinde gizli sınıfı.

Gizli sınıf oluşturma nedeniyle yeni bir anahtar eklemek biraz daha yavaş olabilir gibi geliyor.


48
2017-10-09 03:26



Teşekkürler Domenic! Bu yüzden, hashing'den daha fazla arama yapıyorsam, Object lookup'larını sözlük aramaları olarak kullanmam güvenli görünüyor. - Saher Ahwal
V8 için, dinamik gösterimin hem nokta gösterimi hem de köşeli parantez gösteriminde kullanılmadığı doğru mudur? - Randhir Rawatlal


Evet, bir anahtar eklemenin ve daha sonra erişim için onu kullanmanın olduğunu varsayabilirsiniz. etkili bir şekilde sabit zaman işlemleri.

Kaputun altında JS motoru, sonraki aramaları optimize etmek için bazı teknikler uygulayabilir, ancak herhangi bir algoritma amacıyla O (1) 'i kabul edebilirsiniz.


17
2017-10-09 03:45



İle karşılaştırmak var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); Ne kadar verimli var second={'1': one, '2': two, '3': 'three'}? - Yixing Liu