3 Stimmen

Streicher und Leistung

Ich habe eine for-Schleife wie diese:

    String myString = "123456789";
    String prefix = null;
    for (int i=6;i>=0;--i)
    {
       prefix = myString.substring(0,i);
       process(prefix);
    }

Das Problem ist, dass, wenn dieser Codeblock N Mal ausgeführt wird, N*7 Strings erstellt werden (7 Strings werden bei jeder Ausführung erstellt - weil die substring-Methode einen neuen String erstellt und diese Methode bei jeder Ausführung 7 Mal aufgerufen wird). Ich überlege, wie ich die Leistung in diesem Fall verbessern kann. Ich wollte wissen, ob es eine Möglichkeit gibt, nur einen String pro Ausführung zu verwenden, wobei dieser jedes Mal geändert wird. Das ist der Zweck des StringBuilders, aber ich denke, der StringBuilder hilft in diesem Fall nicht:

    String myString = "123456789";
    StringBuilder prefix = new StringBuilder(myString);
    for (int i=6;i>=0;--i)
    {
       prefix.delete(i,prefix.length());
       process(prefix.toString());
    }

In diesem Fall verweist prefix immer auf dasselbe StringBuilder-Objekt, aber das gleiche Problem tritt an anderer Stelle auf, weil prefix.toString() immer ein neues String-Objekt zurückgibt.

Irgendeine Idee?

(Ich weiß, dass das Thema schon oft behandelt wurde. Aber ich habe einige Suche getan und ich habe keine Lösung gefunden, vielleicht ist das die minimale Nutzung des Speichers?)

Vielen Dank für Ihre Hilfe

6voto

NPE Punkte 462670

Es ist zwar richtig, dass myString.substring(0, i) erstellt eine neue String Objekts, beachten Sie bitte, dass dabei die zugrunde liegenden Zeichendaten nicht kopiert werden.

Bevor Sie etwas an diesem Code ändern, würde ich einen Profiler verwenden, um zu überprüfen, ob dies tatsächlich ein Engpass ist (entweder in Bezug auf die CPU-Auslastung oder in Bezug auf die Belastung des Garbage Collectors).

1voto

HefferWolf Punkte 3864

Was genau ist das Ziel dieser Maßnahme?

Du hast Recht, es gibt 7 Instanzen von String, die während deiner Schleife erstellt werden, aber da Strings unveränderlich sind, speichern alle von ihnen keine Kopie der Quellzeichenkette, sondern sind nur ein Verweis auf die alte Zeichenkette (die sicher ist, weil sie sich nicht ändern kann), daher verbrauchen sie nicht wirklich so viel Speicher.

1voto

Jordan Huizenga Punkte 11

Was meinen Sie mit Nutzung des Speichers?

Wenn Sie Ihre zweite Methode verwenden, wird zwar eine neue Zeichenkette erstellt, aber der Garbage Collector von Java entfernt die Zeichenkette aus dem Speicher, sobald die Methode vom Aufrufstapel entfernt wurde (d. h. die Methode ist beendet). Sie haben also immer nur 2 Strings - den ursprünglichen String und den Präfix-String.

0voto

Lukas Eder Punkte 194234

Wenn Sie diese Optimierung wirklich benötigen, dann ist die einzige Möglichkeit, die ich sehe, den Index an die Prozessmethode zu übergeben und die ursprüngliche Zeichenfolge in dieser Methode zu bearbeiten:

for (int i=6;i>=0;--i)
{
   process(prefix, i);
}

Je nachdem, was die Prozessmethode tut, könnte dies in der Tat etwas schneller sein für große Werte von i

0voto

Shivan Dragon Punkte 14756

"Ich wollte wissen, ob es eine Möglichkeit gibt, nur einen String pro Ausführung zu verwenden, wobei dieser jedes Mal geändert wird." - Nein, das wird nicht funktionieren, da die String-Klasse unveränderlich ist. Wenn Sie Code haben, der viele Zeichenfolgen ändern muss, empfehle ich, ausschließlich StringBuilder zu verwenden (d.h. ändern Sie Ihre "process"-Methode so, dass sie ein StringBuilder-Argument akzeptiert).

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