Frage

Auf meinem Team, wir normalerweise tun String concatentation wie folgt aus:

var url = // some dynamically generated URL
var sb = new StringBuffer();
sb.append("<a href='").append(url).append("'>click here</a>");

Offensichtlich ist die folgende ist viel besser lesbar:

var url = // some dynamically generated URL
var sb = "<a href='" + url + "'>click here</a>";

Aber die JS-Experten behaupten, dass die + Betreiber weniger performant als StringBuffer.append(). Ist das wirklich wahr?

War es hilfreich?

Lösung

Internet Explorer ist der einzige Browser, der wirklich von dieser Welt in der heutigen leidet. (Versionen 5, 6 und 7 waren Hund langsam. 8 zeigen nicht den gleichen Abbau.) Was mehr ist, IE immer langsamer wird, je länger die Zeichenfolge ist.

Wenn Sie lange Strings haben dann verketten definitiv eine Array.join Technik verwenden. (Oder einige String Wrapper um diese, zur besseren Lesbarkeit.) Aber wenn die Saiten sind kurz nicht stören.

Andere Tipps

Ihr Beispiel ist nicht gut, dass es sehr unwahrscheinlich ist, dass die Leistung signficantly anders sein wird. In Ihrem Beispiel Lesbarkeit sollte Trumpf Leistung, da die Leistungssteigerung eines vs anderen ist vernachlässigbar. Die Vorteile eines Arrays (String) sind nur sichtbar, wenn Sie viele concatentations tun. Selbst dann sehr Ihre Meilenzahl kann auf Ihrem Browser abhängig.

Hier ist eine detaillierte Performance-Analyse, die Leistung zeigt, die verschiedenen JavaScript Verkettung Methoden in vielen verschiedenen Browsern; String Leistung eine Analyse

join () einmal, concat () einmal, join () für, + = für, concat () für „ loading=

Mehr:
Ajaxian >> String Leistung in IE: Array.join vs + = Fortsetzung

Ja, es ist wahr, aber Sie sollten sich nicht darum. Gehen Sie mit der, die leichter zu lesen ist. Wenn Sie Benchmarks der App haben, konzentrieren sich dann auf die Engpässe.

Ich würde die String-Verkettung erraten wird nicht Ihr Engpass sein.

Vereinbarte mit Michael Haren .

Auch die Verwendung von Arrays betrachten und kommen, wenn die Leistung in der Tat ein Problem.

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));

Versuchen Sie folgendes:

var s = ["<a href='", url, "'>click here</a>"].join("");

JavaScript keinen nativen String Gegenstand haben, so dass ich dies aus einer Bibliothek ist vorausgesetzt, Sie verwenden oder ein Merkmal eines ungewöhnlichen Host-Umgebung (das heißt kein Browser).

Ich bezweifle, eine Bibliothek (in JS geschrieben) etwas schneller produzieren würde, obwohl eine native String Objekt könnte. Die endgültige Antwort kann mit einem Profiler zu finden (wenn Sie in einem Browser ausgeführt werden dann Firebug Sie mit einem Profiler für die JS-Engine in Firefox gefunden bieten wird).

Wie schon einige Benutzer festgestellt haben. Das ist irrelevant für kleine Strings

Und neue JavaScript-Engine in Firefox, Safari oder Google Chrome optimiert so

"<a href='" + url + "'>click here</a>";

ist so schnell wie

["<a href='", url, "'>click here</a>"].join("");

Mit den Worten von Knuth, „vorzeitige Optimierung ist die Wurzel aller Übel!“ Die kleine defference oder so wird höchstwahrscheinlich nicht viel von einer Wirkung am Ende; Ich würde die Lesbarkeit eines wählen.

Die leichter zu lesen Methode spart Menschen wahrnehmbare Mengen an Zeit, wenn Blick auf den Code, während die „schneller“ Verfahren nur unmerklich und wahrscheinlich vernachlässigbare Mengen an Zeit verschwendet, wenn die Leute die Seite durchsuchen.

Ich weiß, dass dieser Beitrag ist lahm, aber ich gepostet versehentlich etwas ganz anderes denkt, dies war ein anderer Thread, und ich weiß nicht, wie Beiträge zu löschen. Mein schlechter ...

Es ist ziemlich einfach, eine schnelle Benchmark einzurichten und überprüfen Variationen Javascript Leistung durch jspref.com . Welches war wahrscheinlich nicht um, wenn diese Frage gestellt wurde. Aber für Leute, auf diese Frage zu stolpern sie sollten alook an der Stelle nehmen.

Ich habe eine schnelle Prüfung der verschiedenen Methoden der Verkettung unter http://jsperf.com/string -concat-Methoden-test .

Ich mag funktionalen Stil verwenden, wie zum Beispiel:

function href(url,txt) {
  return "<a href='" +url+ "'>" +txt+ "</a>"
}

function li(txt) {
  return "<li>" +txt+ "</li>"
}

function ul(arr) {
  return "<ul>" + arr.map(li).join("") + "</ul>"
}

document.write(
  ul(
    [
      href("http://url1","link1"),
      href("http://url2","link2"),
      href("http://url3","link3")
    ]
  )
)

Dieser Stil sieht lesbar und transparent sein. Sie führt zur Schaffung von Werkzeugen, die Wiederholung in Code reduziert.

Dies führt dazu, auch automatisch Zwischen Strings zu verwenden.

Wie weit ich weiß, bedeutet jede Verkettung eine Speicher Umschichtung. Das Problem ist also nicht der Betreiber verwendet, es zu tun, ist die Lösung der Anzahl der Verkettungen zu reduzieren. Zum Beispiel macht die Verkettungen außerhalb der Iteration Strukturen, wenn Sie können.

Ja, nach dem üblichen Benchmarks. Z. http://mckoss.com/jscript/SpeedTrial.htm

Aber für die kleinen Streicher, das ist irrelevant. Sie werden nur über Leistungen auf sehr große Strings interessieren. Was in den meist JS-Skript mehr, dann ist der Flaschenhals ist selten auf den String-Manipulationen, da es nicht genug davon ist.

Sie sollten die DOM-Manipulation sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top