Inefficient use StringBuffer or StringBuilder[Optimization|clean-up] {Package: con.sun. * java.lang*} (original) (raw)

Otávio Gonçalves de Santana otaviojava at java.net
Fri Jun 7 15:46:16 UTC 2013


I wrote a simple test.

public class BuilderTest{

public void testAppend(String name){

StringBuilder sb=new StringBuilder();

sb.append("hello").append(" World: ").append(name);

}

public void testConcat(String name){

StringBuilder sb=new StringBuilder();

sb.append("hello" +" World: "+name);

}

}

public void testAppend(java.lang.String);

Code:

Stack=2, Locals=3, Args_size=2

0: new #2; //class java/lang/StringBuilder

3: dup

4: invokespecial #3; //Method java/lang/StringBuilder."":()V

7: astore_2

8: aload_2

9: ldc #4; //String hello

11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

14: ldc #6; //String World:

16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

19: aload_1

20: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

23: pop

24: return

public void testConcat(java.lang.String);

Code:

Stack=3, Locals=3, Args_size=2

0: new #2; //class java/lang/StringBuilder

3: dup

4: invokespecial #3; //Method java/lang/StringBuilder."":()V

7: astore_2

8: aload_2

9: new #2; //class java/lang/StringBuilder

12: dup

13: invokespecial #3; //Method java/lang/StringBuilder."":()V

16: ldc #7; //String hello World:

18: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

21: aload_1

22: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

25: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la

ng/String;

28: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

31: pop

32: return

}

In the second method it creates a second StringBuilder with the toString() of the first one.

I think doing this get some performance.

On Fri, Jun 7, 2013 at 11:09 AM, Tom Hawtin <tom.hawtin at oracle.com> wrote:

On 07/06/2013 14:54, Andrew Haley wrote:

On 06/07/2013 02:18 PM, Otávio Gonçalves de Santana wrote:

sb.append(" xxx: [" + getXXX() + "]\n");

for this: sb.append(" xxx: [").append(getXXX()).append("]**\n");

Hmm. I wonder that a JIT can't do this automatically. Perhaps it already does; I haven't looked. The capacity of the StringBuilder may be different for the two statements. So even a "high-level rewriting" wouldn't be sufficiently equivalent. Tom

-- Atenciosamente.

Otávio Gonçalves de Santana

blog: http://otaviosantana.blogspot.com.br/ twitter: http://twitter.com/otaviojava site: http://www.otaviojava.com.br (11) 98255-3513



More information about the core-libs-dev mailing list