Optimierung StringBuilder

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

kann man sowas irgendwie optimieren mit char?

Code:
 StringBuilder sb = new StringBuilder();                                 
        sb.append(diffTime.get(0).length() == 1 ? "0" + diffTime.get(0) : diffTime.get(0));
        sb.append(diffTime.get(1).length() == 1 ? "0" + diffTime.get(1) : diffTime.get(1));
        sb.append(diffTime.get(2).length() == 1 ? "0" + diffTime.get(2) : diffTime.get(2));
        sb.append(diffTime.get(3).length() == 1 ? "0" + diffTime.get(3) : diffTime.get(3));

dieser Programmteil soll möglichst schnell abgearbeitet werden, da es sich in einer Schleife befindet,

schöne Grüße,
 
M

maki

Gast
Wenn du das hier
Code:
StringBuilder sb = new StringBuilder();
in der Schleife lässt, brauchst du über optimierungen des Stringbuilders gar nicht erst nachzudenken, das kannst du gleich den + Operator mit Strings verwenden.
 

Marco13

Top Contributor
Mit DecimalFormat dürfte das noch deutlich langsamer sein.

Ein kleiner Microbenchmark (wie immer, unzuverlässig, aber zeigt zumindest eine ... "Tendenz" auf...)

Code:
import java.util.*;

class StringBuilderTest
{
    static List<String> diffTime;

    public static void main(String args[])
    {
        diffTime = new ArrayList<String>();
        diffTime.add("1");
        diffTime.add("23");
        diffTime.add("4");
        diffTime.add("56");

        for (int i=10000; i<=10000000; i*=10)
        {
            System.out.println("Test "+i);
            test0(i);
            test1(i);
            test2(i);
        }
    }

    public static void test0(int n)
    {
        StringBuilder sb = new StringBuilder();
        long before = System.nanoTime();
        for (int i=0; i<n; i++)
        {
            sb.append(diffTime.get(0).length() == 1 ? "0" + diffTime.get(0) : diffTime.get(0));
            sb.append(diffTime.get(1).length() == 1 ? "0" + diffTime.get(1) : diffTime.get(1));
            sb.append(diffTime.get(2).length() == 1 ? "0" + diffTime.get(2) : diffTime.get(2));
            sb.append(diffTime.get(3).length() == 1 ? "0" + diffTime.get(3) : diffTime.get(3));
        }
        long after = System.nanoTime();
        System.out.println(sb.toString().charAt(0)+" test0 time "+(after-before)/1000000);
    }

    public static void test1(int n)
    {
        StringBuilder sb = new StringBuilder();
        long before = System.nanoTime();
        for (int i=0; i<n; i++)
        {
            int index = sb.length();
            sb.setLength(sb.length()+8);

            for (int j=0; j<4; j++)
            {
                String s = diffTime.get(j);
                if (s.length() == 1)
                {
                    sb.setCharAt(index++, '0');
                    sb.setCharAt(index++, s.charAt(0));
                }
                else
                {
                    sb.setCharAt(index++, s.charAt(0));
                    sb.setCharAt(index++, s.charAt(1));
                }
            }
        }
        long after = System.nanoTime();
        System.out.println(sb.toString().charAt(0)+" test1 time "+(after-before)/1000000);
    }

    public static void test2(int n)
    {
        StringBuilder sb = new StringBuilder(n*8);
        sb.setLength(n*8);
        int index = 0;
        String s = null;
        long before = System.nanoTime();
        for (int i=0; i<n; i++)
        {
            s = diffTime.get(0);
            if (s.length() == 1) { sb.setCharAt(index++, '0');         sb.setCharAt(index++, s.charAt(0)); }
            else                 { sb.setCharAt(index++, s.charAt(0)); sb.setCharAt(index++, s.charAt(1)); }
            s = diffTime.get(1);
            if (s.length() == 1) { sb.setCharAt(index++, '0');         sb.setCharAt(index++, s.charAt(0)); }
            else                 { sb.setCharAt(index++, s.charAt(0)); sb.setCharAt(index++, s.charAt(1)); }
            s = diffTime.get(2);
            if (s.length() == 1) { sb.setCharAt(index++, '0');         sb.setCharAt(index++, s.charAt(0)); }
            else                 { sb.setCharAt(index++, s.charAt(0)); sb.setCharAt(index++, s.charAt(1)); }
            s = diffTime.get(3);
            if (s.length() == 1) { sb.setCharAt(index++, '0');         sb.setCharAt(index++, s.charAt(0)); }
            else                 { sb.setCharAt(index++, s.charAt(0)); sb.setCharAt(index++, s.charAt(1)); }
        }
        long after = System.nanoTime();
        System.out.println(sb.toString().charAt(0)+" test2 time "+(after-before)/1000000);
    }


}


Ausgabe
Code:
Test 10000
0 test0 time 30
0 test1 time 26
0 test2 time 14
Test 100000
0 test0 time 126
0 test1 time 34
0 test2 time 42
Test 1000000
0 test0 time 732
0 test1 time 160
0 test2 time 73
Test 10000000
0 test0 time 8033
0 test1 time 1868
0 test2 time 744

Ob das "loop unrolling" bei test2 sich wirklich lohnt :? naja, ohne hat es ca. 20% mehr Zeit gebraucht, aber... wie verläßlich das ist .. hm.
 

Marco13

Top Contributor
Vielleicht als Nachtrag: Wenn man Einfluß darauf hätte, was "diffTime" ist (und enthält) könnte man sich das vermutlich eh sparen...
 
T

tuxedo

Gast
Man muss ja nicht unbedingt DecimalFormat in die Schleife rein bringen. Gibt vielleicht noch den einen oder anderen Fleck an dem man da Ansetzen kann, und die "Formatierung" zentral gestaltet. Aber das kommt eben auf die Implementierung an.

- Alex
 
G

Guest

Gast
Danke für die Anregungen, ich hab, so weit es mir möglich war, alle news aus den Schleifen getan, nur das eine new unten ist mir noch in der for- Schleife geblieben, lässt sich da was optimieren?


Code:
StringBuilder b = new StringBuilder(valueList.get(i));               
            sbValue.append(b.length() == 1 ? "0" + b.toString() : b.toString());


ich habe es getestet, das oben ist schneller als wenn ich einfach "0" + valueList.get(i) schreibe,
Kann ich da noch was machen?
 
T

tuxedo

Gast
Du musst nicht jedesmal einen neuen SB erzeugen. Du kannst den wiederverwenden.

- Alex
 
G

Gast

Gast
einfach die länge auf 0 setzen, kostet fast nix.
Code:
final StringBuilder buf = new StringBuilder();
for( something )
{
   buf.setLength( 0 );
   // mach was mit buf
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
F Zeit Optimierung - bzw. ms Optimierung Allgemeine Java-Themen 35
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
K Optimierung kürzester Weg im Warenlager Allgemeine Java-Themen 8
O Algorithmus Optimierung Allgemeine Java-Themen 3
H Optimierung durch Threads Allgemeine Java-Themen 31
C Programmflow-Optimierung Allgemeine Java-Themen 7
G Klasse Optimierung Allgemeine Java-Themen 6
N Optimierung einer Berechnung Allgemeine Java-Themen 17
S jdk versus openjdk - Optimierung von Konstanten? Allgemeine Java-Themen 8
P Optimierung (&& ||) deaktivieren / umgehen? Allgemeine Java-Themen 9
S Optimierung vom Laden von Grafiken Allgemeine Java-Themen 4
S Brainstorming --> Optimierung vonn Gefälleplatten Allgemeine Java-Themen 8
D Optimierung beim Casten Allgemeine Java-Themen 4
Zrebna Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder Allgemeine Java-Themen 14
Thallius Merkwürdiges StringBuilder verhalten (Char Encoding) Allgemeine Java-Themen 6
V Stringbuilder zickt rum? -> Eclipse Allgemeine Java-Themen 12
B StringBuilder von File einlesen Allgemeine Java-Themen 8
W StringBuilder effektiv auf OutputStream schreiben Allgemeine Java-Themen 3
A Problem mit StringBuilder delete - find den Fehler nicht Allgemeine Java-Themen 9
T String vs StringBuilder vs StringBuffer Allgemeine Java-Themen 8
Escorter StringBuilder automatisch? Allgemeine Java-Themen 7
P StringBuffer, StringBuilder und StringWriter Allgemeine Java-Themen 4
D StringBuilder kaputt? Allgemeine Java-Themen 2
Y StringBuilder vs. Stringverkettung Allgemeine Java-Themen 61
G wieso wird der String des StringBuilder immer länger? Allgemeine Java-Themen 2
G StringBuilder Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben