2 Stimmen

Warum sind Saiten notorisch teuer?

Was macht die Implementierung von Zeichenketten so teuer in der Handhabung?

Ist es unmöglich, eine "billige" String-Implementierung zu erstellen?

oder habe ich das völlig falsch verstanden?

Gracias

22voto

Robert Venables Punkte 5903

Welche Sprache?

Zeichenketten sind in der Regel unveränderlich, d. h. jede Änderung der Daten führt dazu, dass eine neue Kopie der Zeichenkette erstellt wird. Dies kann bei großen Zeichenketten Auswirkungen auf die Leistung haben.

Dies ist jedoch ein wichtiges Merkmal, weil es Optimierungen wie das Interning ermöglicht. Interning reduziert die Größe von Textdaten, indem identische Zeichenketten auf dieselbe Kopie der Daten verweisen.

Wenn Sie sich Sorgen um die Leistung bei Strings machen, verwenden Sie einen StringBuilder (verfügbar in C# und Java) oder ein anderes Konstrukt, das mit veränderbaren Textdaten arbeitet.

Wenn Sie mit einer großen Menge an Textdaten arbeiten und eine leistungsstarke Lösung für Zeichenketten benötigen, die dennoch Platz spart, Prüfung der Verwendung von Seilen .

2voto

luiscubal Punkte 24263

Das Problem bei Zeichenketten ist, dass sie keine primitiven Typen sind. Sie sind Arrays. Daher leiden sie unter den gleichen Geschwindigkeits- und Speicherproblemen wie Arrays (vielleicht mit einigen Optimierungen).

Nun, "billige" Implementierungen würden eine Menge Zeug erfordern: Verkettung, indexOf, etc. Es gibt viele Möglichkeiten, dies zu tun. Sie kann die Umsetzung zu verbessern, aber es gibt einige Grenzen. Da Zeichenketten für Computer nicht "natürlich" sind, benötigen sie mehr Speicher und sind langsamer zu verarbeiten... IMMER. Ein Algorithmus für die Verkettung von Zeichenketten wird nie schneller sein als ein anständiger Algorithmus für die Summe ganzer Zahlen.

2voto

Harish Punkte 3093

Da in Java jedes Mal eine neue Kopie des Objekts erstellt wird, ist es ratsam, StringBuffer zu verwenden

Syntax

StringBuffer strBuff=new StringBuffer();
strBuff.append("StringBuffer");
strBuff.append("is");
strBuff.append("more");
strBuff.append("economical");
strBuff.append("than");
strBuff.append("String");
String string=strBuff.tostring();

2voto

NoMoreZealots Punkte 5144

Viele der hier angeführten Punkte sind gut getroffen. In Einzelfällen können Sie in der Lage sein, zu betrügen und tun, was wie mit einem 64bit int zu 8 Bytes zu einer Zeit in einem String zu vergleichen, aber es gibt nicht eine Menge von verallgemeinerten Fällen, wo Sie Operationen optimieren können. Wenn man einen String im "Pascal-Stil" mit einem numerischen Längenfeld hat, kann man die Logik kurzschließen, um den Rest des Strings nur zu überprüfen, wenn die Länge nicht gleich ist. Andere Operationen erfordern in der Regel, dass Sie die Zeichen byteweise behandeln oder sie vollständig kopieren, wenn Sie sie verwenden. d.h. Verkettung => Länge von String 1 ermitteln, Länge von String 2 ermitteln, Speicher zuweisen, String 1 kopieren, String 2 kopieren. Es wäre möglich, solche Operationen mit einem DMA-Controller in einer String-Library durchzuführen, aber der Overhead beim Einrichten für kleine Strings würde die Vorteile überwiegen.

Pete

1voto

McAden Punkte 13272

Das hängt ganz davon ab, was Sie damit machen wollen. Meistens ist es, dass es in der Regel erfordert mindestens 1 neue Array-Zuordnung, es sei denn, es ist ein einzelnes Zeichen in einer direkten Suche zu ersetzen. Auf der einfachsten Ebene ist ein String ein Array von Zeichen. So gut wie alles, was Sie tun wollen, beinhaltet Iteration, Entfernen oder Einfügen neuer Dinge in ein Array.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X