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

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."<init>":()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."<init>":()V

   7:   astore_2

   8:   aload_2

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

   12:  dup

   13:  invokespecial   #3; //Method java/lang/StringBuilder."<init>":()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