SORU
4 EYLÜL 2011, Pazar


Neden dize birleştirme dizi daha katılacak mı?

Bugün, dize birleştirme hızı hakkında this thread okudum.

Şaşırtıcı bir şekilde, dize birleştirme kazandı:

http://jsperf.com/array-join-vs-string-connect

http://jsperf.com/join-concat/2

Sonuç düşündüğümden tersiydi. Ayrıca, this this gibi ters açıklıyor bu konu hakkında birçok makale var.

Tarayıcılar dizesi için concat En son sürümü optimize edilmiş olduğunu tahmin edebiliyorum, ama bunu nasıl yapıyorlar? Daha iyi dizeleri bitiştirmek zaman kullanmak için en iyi olduğunu söyleyebilir miyiz?

CEVAP
4 EYLÜL 2011, Pazar


Tarayıcı iyileştirmeleri dize dize birleştirme resim değişti.

Firefox dize birleştirme optimize etmek için ilk tarayıcı oldu. Sürüm 1.0, dizi tekniği ile başlayarak aslında her durumda artı operatörü kullanılarak daha yavaştır. Diğer tarayıcılar da dize birleştirme, 8 de daha iyi performans artı operatörü Haritayı kullanarak Explorer Safari, Opera, Chrome, ve Internet optimize edilmiş. Sürüm 8 önce Internet Explorer gibi bir optimizasyon yoktu ve dizi tekniği artı operatör her zaman daha hızlıdır.

Writing Efficient JavaScript: Chapter 7 – Even Faster Websites

V8 javascript motoru (Google Chrome için) this code dize birleştirme yapmak için kullanır:

// ECMA-262, section 15.5.4.6
function StringConcat() {
  if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
    throw MakeTypeError("called_on_null_or_undefined", ["String.prototype.concat"]);
  }
  var len = %_ArgumentsLength();
  var this_as_string = TO_STRING_INLINE(this);
  if (len === 1) {
    return this_as_string   %_Arguments(0);
  }
  var parts = new InternalArray(len   1);
  parts[0] = this_as_string;
  for (var i = 0; i < len; i  ) {
    var part = %_Arguments(i);
    parts[i   1] = TO_STRING_INLINE(part);
  }
  return %StringBuilderConcat(parts, len   1, "");
}

Yani, iç o zaman dolu olan bir İnternalArray (parts değişken), oluşturarak optimize edin. StringBuilderConcat işlevi bu parçaları denir. Hızlı StringBuilderConcat işlevi ağır optimize edilmiş bazı C kodu olduğu için. RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) kodunu görmek için buraya, ancak arama runtime.cc dosyasında teklifi için çok uzun bir süre.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • footiecyclo

    footiecyclo

    26 EYLÜL 2009
  • JorteexHD

    JorteexHD

    20 NİSAN 2012
  • The Amazing Atheist

    The Amazing

    20 Kasım 2006