Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[JAVA] StringBuilder benchmarks

Pagina: 1
Acties:
  • 157 views sinds 30-01-2008
  • Reageer

  • bodiam
  • Registratie: December 2001
  • Laatst online: 31-12-2024
Hoi allen,

JDK 1.5 is uit, en er zitten wat nieuwe fratsen in. Zo ook StringBuilder, welke volgens de documentatie:
This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.
Okee, ik blij: gratis performance winst. Ik heb dus net even een klein test programmatje gemaakt, maar daaruit blijkt dat de resultaten helemaal niet zo geweldig zijn.

code:
1
2
3
builder took : 284812455 nanoseconds
buffer took  : 174961343 nanoseconds
builder took : 238469135 nanoseconds


Ik heb het ook met milliseconds geprobeerd, maar zelfde resultaat.

Dit is mijn testprogramma:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class SpeedTest
{
  public static void main(String[] args)
  {
    long beginTime = System.nanoTime();
    StringBuilder builder = new StringBuilder();

    for(int i = 0; i < 1000000; i ++ )
    {
      builder.append("erik");
    }
    System.out.println("builder took : " + (System.nanoTime() - beginTime) + " nanoseconds");


    beginTime = System.nanoTime();
    StringBuffer buffer  = new StringBuffer();

    for(int i = 0; i < 1000000; i ++ )
    {
      buffer.append("erik");
    }
    System.out.println("buffer took  : " + (System.nanoTime() - beginTime) + " nanoseconds");


    beginTime = System.nanoTime();
    StringBuilder builder2 = new StringBuilder();

    for(int i = 0; i < 1000000; i ++ )
    {
      builder2.append("erik");
    }
    System.out.println("builder took : " + (System.nanoTime() - beginTime) + " nanoseconds");
  }
}


Suggesties iemand?

edit:
fout in test weggehaald

[ Voor 9% gewijzigd door bodiam op 07-10-2004 09:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom is dat slecht? Je doet 1 miljoen string concatenaties in (gemiddeld) 0.21 seconden

Ik lees niet goed, je vergelijkt het met de oude StringBuffer.
Mja, 1 zo'n case runnen is natuurlijk niet helemaal representatief. Zet het geheel eens in een loopje van 10 iteraties oid

[ Voor 54% gewijzigd door .oisyn op 07-10-2004 00:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • momania
  • Registratie: Mei 2000
  • Laatst online: 13-11 22:36

momania

iPhone 30! Bam!

Misschien moet je het contructen eens niet meerekenen.
Waarschijnlijk is de appender wel sneller van de StringBuilder maar juist het aanmaken van zo'n Stringbuilder net iets langzamer :)

Neem je whisky mee, is het te weinig... *zucht*


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het lijkt me stug dat het constructen van zo'n object 0.06 tot 0.11 seconden duurt, dat is een eeuwigheid

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
TS: misschien is er iets fout gegaan met copy/pasten, maar in de code uit je post gebruik je in de 2de for-loop de builder ipv de buffer. Denk niet dat dat de bedoeling is ;)

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


  • bodiam
  • Registratie: December 2001
  • Laatst online: 31-12-2024
@Lone Gunman: sjit, je hebt gelijk. Copy and past foutje.

Ik heb het aangepast, plus een nieuwe test gemaakt door het 10 keer te draaien achter elkaar, en dit is nu de output:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
builder took : 284880620 nanoseconds
buffer took  : 308191404 nanoseconds
builder took : 225649070 nanoseconds

builder took : 182860950 nanoseconds
buffer took  : 245310228 nanoseconds
builder took : 193335187 nanoseconds

builder took : 176596187 nanoseconds
buffer took  : 209236090 nanoseconds
builder took : 176646752 nanoseconds

builder took : 176184683 nanoseconds
buffer took  : 222142479 nanoseconds
builder took : 223827889 nanoseconds

builder took : 173922384 nanoseconds
buffer took  : 244585555 nanoseconds
builder took : 191395834 nanoseconds

builder took : 175674003 nanoseconds
buffer took  : 210162744 nanoseconds
builder took : 176640047 nanoseconds

...


Oftwel: StringBuilder is in mijn geval toch sneller. Sommige mensen zijn het daar echter niet mee eens, zie: http://jroller.com/commen...ngbuilder_vs_stringbuffer

Maar ook als ik zijn test draai, is StringBuilder altijd sneller dan StringBuffer:

code:
1
2
StringBuffer:  171
StringBuilder: 160


Okee, was gewoon een stomme fout van mij dus. Excuses!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Hehe hilarisch dit :)

Je eerste "foute" test is achteraf bekeken ook wel een beetje vreemd aangezien de 2de stringbuilder toch representatief veel sneller is dan de eerste maal.
OK, je gebruikt hetzelfde object, maar ondertussen maak je ook nog een StringBuffer instance aan... ;)

[ Voor 3% gewijzigd door -FoX- op 07-10-2004 08:37 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10 13:51

pjvandesande

GC.Collect(head);

Profile de toString methods ook is, niet geheel onbelangrijk!

  • Verbal Kint
  • Registratie: Januari 2001
  • Laatst online: 27-05 14:55

Verbal Kint

The man with the plan

Titelchange dan maar? Zo komen (foute) geruchten de wereld in, mensen die alleen koppen snellen en dus niet verder kijken...

edit:
Top!

[ Voor 7% gewijzigd door Verbal Kint op 07-10-2004 10:38 ]

Great minds think alike!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik heb een paar kleine testjes gedaan, gebaseerd op bovenstaande code en de toString-methodes lijken vrijwel evensnel te zijn.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10 13:51

pjvandesande

GC.Collect(head);

ACM schreef op 07 oktober 2004 @ 10:27:
Ik heb een paar kleine testjes gedaan, gebaseerd op bovenstaande code en de toString-methodes lijken vrijwel evensnel te zijn.
Hoe heb jij het getest, hoe groot waren de objecten en wat waren de resultaten?
Ik lees namelijk:
Juha Komulainen:
When you call StringBuffer.toString(), it creates a new String which shares the same array of characters, but StringBuilder.toString() will need to clone the characters. (See JDK sources for details.)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Vrij groot:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class StringBuilderTest
{
    public static void main(String[] args)
    {
        for(int i = 0; i < 10; i++)
        {
            runBuilderTest();
            runBufferTest();
            System.out.println();
        }
    }

    public static void runBufferTest()
    {
        long beginTime = System.nanoTime();
        StringBuffer buffer  = new StringBuffer();

        for(int i = 0; i < 1000000; i ++ )
        {
            buffer.append("erik");
        }
        System.out.println("buffer took  : " + (System.nanoTime() - beginTime) + " nanoseconds");
        beginTime = System.nanoTime();
        buffer.toString();
        System.out.println("buf.tS took  : " + (System.nanoTime() - beginTime) + " nanoseconds");

    }

    public static void runBuilderTest()
    {
        long beginTime = System.nanoTime();
        StringBuilder builder2 = new StringBuilder();

        for(int i = 0; i < 1000000; i ++ )
        {
            builder2.append("erik");
        }
        System.out.println("builder took : " + (System.nanoTime() - beginTime) + " nanoseconds");
        beginTime = System.nanoTime();
        builder2.toString();
        System.out.println("buil.tS took : " + (System.nanoTime() - beginTime) + " nanoseconds");
    }
}

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
builder took : 498483000 nanoseconds
buil.tS took : 149756000 nanoseconds
buffer took  : 360478000 nanoseconds
buf.tS took  : 142457000 nanoseconds

builder took : 410321000 nanoseconds
buil.tS took : 74067000 nanoseconds
buffer took  : 439059000 nanoseconds
buf.tS took  : 145381000 nanoseconds

builder took : 420637000 nanoseconds
buil.tS took : 145112000 nanoseconds
buffer took  : 381095000 nanoseconds
buf.tS took  : 143785000 nanoseconds

builder took : 315948000 nanoseconds
buil.tS took : 142940000 nanoseconds
buffer took  : 351548000 nanoseconds
buf.tS took  : 141672000 nanoseconds

builder took : 327569000 nanoseconds
buil.tS took : 142746000 nanoseconds
buffer took  : 362586000 nanoseconds
buf.tS took  : 142377000 nanoseconds

builder took : 326520000 nanoseconds
buil.tS took : 142923000 nanoseconds
buffer took  : 363012000 nanoseconds
buf.tS took  : 141767000 nanoseconds

builder took : 413667000 nanoseconds
buil.tS took : 73525000 nanoseconds
buffer took  : 439611000 nanoseconds
buf.tS took  : 144945000 nanoseconds

builder took : 424494000 nanoseconds
buil.tS took : 145818000 nanoseconds
buffer took  : 379488000 nanoseconds
buf.tS took  : 143439000 nanoseconds

builder took : 318382000 nanoseconds
buil.tS took : 142521000 nanoseconds
buffer took  : 351158000 nanoseconds
buf.tS took  : 141755000 nanoseconds

builder took : 326589000 nanoseconds
buil.tS took : 142963000 nanoseconds
buffer took  : 353015000 nanoseconds
buf.tS took  : 141889000 nanoseconds


En als ik er nog even een thread.sleep(100) en een System.gc bij stop gaat het zelfs zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
builder took : 525412000 nanoseconds
buil.tS took : 147518000 nanoseconds
buffer took  : 367630000 nanoseconds
buf.tS took  : 143290000 nanoseconds

builder took : 379296000 nanoseconds
buil.tS took : 73617000 nanoseconds
buffer took  : 438103000 nanoseconds
buf.tS took  : 144993000 nanoseconds

builder took : 383518000 nanoseconds
buil.tS took : 145725000 nanoseconds
buffer took  : 381010000 nanoseconds
buf.tS took  : 143677000 nanoseconds

builder took : 322382000 nanoseconds
buil.tS took : 143050000 nanoseconds
buffer took  : 341946000 nanoseconds
buf.tS took  : 142355000 nanoseconds

builder took : 329031000 nanoseconds
buil.tS took : 145580000 nanoseconds
buffer took  : 386745000 nanoseconds
buf.tS took  : 143182000 nanoseconds

builder took : 329298000 nanoseconds
buil.tS took : 142993000 nanoseconds
buffer took  : 389362000 nanoseconds
buf.tS took  : 143055000 nanoseconds

builder took : 329189000 nanoseconds
buil.tS took : 143162000 nanoseconds
buffer took  : 386470000 nanoseconds
buf.tS took  : 143005000 nanoseconds

builder took : 331946000 nanoseconds
buil.tS took : 142592000 nanoseconds
buffer took  : 389294000 nanoseconds
buf.tS took  : 143780000 nanoseconds

builder took : 331926000 nanoseconds
buil.tS took : 143181000 nanoseconds
buffer took  : 389027000 nanoseconds
buf.tS took  : 142747000 nanoseconds

builder took : 332129000 nanoseconds
buil.tS took : 142627000 nanoseconds
buffer took  : 390014000 nanoseconds
buf.tS took  : 142748000 nanoseconds

[ Voor 23% gewijzigd door ACM op 07-10-2004 10:58 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10 13:51

pjvandesande

GC.Collect(head);

Dat scheelt dus geen * :)
Pagina: 1