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
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
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 .
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.
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();
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
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 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.