StringBuilder buffer allocation support in compiler

Laszlo Hornyak laszlo.hornyak at gmail.com
Fri Jun 6 16:07:04 UTC 2014


I think that is in sync with the subject of this email thread.


On Thu, Jun 5, 2014 at 11:01 PM, Vitaly Davidovich <vitalyd at gmail.com>
wrote:

> I think your benchmark is testing something else though, which is cost of
> resizing during appends.
>
> To test the issue at hand, try writing two methods, one which does string
> appends manually to a pre allocated SB of the right size (which is what you
> want javac to do) and one that does the string concat.
>
> Sent from my phone
> On Jun 5, 2014 4:39 PM, "Laszlo Hornyak" <laszlo.hornyak at gmail.com> wrote:
>
>> Hi Vitaly,
>>
>> I tested with server VM and the test code has some warmup so that the JIT
>> should have enough time to kick in, but I will check stringopts if it
>> should do some relevant optimization.
>>
>>
>>
>> On Thu, Jun 5, 2014 at 9:43 PM, Vitaly Davidovich <vitalyd at gmail.com>
>> wrote:
>>
>>> Hi Laszlo,
>>>
>>> I believe server jit compiler has an optimization pass that will attempt
>>> at fusing this type of pattern into one string allocation -- see
>>> src/share/vm/opto/stringopts.[h|c]pp in the sources.  Have you tried
>>> benchmarking this after jit compiler gets a crack at it?
>>>
>>>
>>> On Thu, Jun 5, 2014 at 3:27 PM, Laszlo Hornyak <laszlo.hornyak at gmail.com
>>> > wrote:
>>>
>>>> Hi,
>>>>
>>>> Given this sample code
>>>>
>>>>     public static String sayHello(String name, int age) {
>>>>         return "Hello " + name + ", this is your " + age + "th
>>>> birthday";
>>>>     }
>>>>
>>>> The compiler will generate this bytecode:
>>>>        0: new           #11                 // class
>>>> java/lang/StringBuilder
>>>>        3: dup
>>>>        4: invokespecial #12                 // Method
>>>> java/lang/StringBuilder."<init>":()V
>>>>        7: ldc           #19                 // String Hello
>>>>        9: invokevirtual #15                 // Method
>>>> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
>>>>       12: aload_0
>>>>       13: invokevirtual #15                 // Method
>>>> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
>>>>       16: ldc           #20                 // String , this is your
>>>>       18: invokevirtual #15                 // Method
>>>> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
>>>>       21: iload_1
>>>>       22: invokevirtual #13                 // Method
>>>> java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
>>>>       25: ldc           #21                 // String th birthday
>>>>       27: invokevirtual #15                 // Method
>>>> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
>>>>       30: invokevirtual #17                 // Method
>>>> java/lang/StringBuilder.toString:()Ljava/lang/String;
>>>>       33: areturn
>>>>
>>>> The most interesting line is:
>>>>        4: invokespecial #12                 // Method
>>>> java/lang/StringBuilder."<init>":()V
>>>>
>>>>
>>>> Since all the string literals are given for the compiler, it could give
>>>> an estimation on the required buffer size to the StringBuilder constructor.
>>>> In this example the string literals already take 32 characters, plus a
>>>> string representation of an integer takes up to 12 characters. The String
>>>> size is 0 to Integer.MAX_VALUE, but 16 might be a good default. In this
>>>> case a constructor call could be generated to allocate a buffer with 50
>>>> characters and some (possibly all) buffer re-allocation could be saved in
>>>> the subsequent append calls.
>>>> The performance gain seems to be significant since the subsequent
>>>> buffer allocations can take up to 30-40 percent of the execution time.
>>>> Is there a specific reason for the java compiler not to support
>>>> pre-allocation of StringBuilder buffer based on string literals and
>>>> parameters?
>>>>
>>>> Thank you,
>>>> Laszlo
>>>>
>>>>
>>>> --
>>>>
>>>> EOF
>>>>
>>>
>>>
>>
>>
>> --
>>
>> EOF
>>
>


-- 

EOF
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20140606/ac1253ed/attachment.html>


More information about the compiler-dev mailing list