OK! A surprising increase in code size. Thanks for checking.

Paul.

> On Jan 30, 2018, at 2:40 AM, Claes Redestad <claes.redes...@oracle.com> wrote:
> 
> The ASM is harder than usual to follow and compare since everything is
> inlined aggressively, but it seems that since CharacterDataLatin1 is only
> invoked for 0 <= ch < 256 (invariant established in CharacterData.of(int ch))
> then the compiler is able to elide bounds check entirely when the byte[] is
> also 256 elements.
> 
> Shrinking the array adds more branches and grows the compiled code size
> for UUID.fromString from 751 to 1341 bytes, so it seems that even from a
> footprint perspective then keeping the array at 256 elements is a win. :-)
> 
> /Claes
> 
> On 2018-01-29 22:04, Claes Redestad wrote:
>> Right, I can't really explain why, but the effect is very visible and
>> reproducible in microbenchmarks. Differences in generated ASM might
>> be indicating that the inlining behavior changes enough to shift the
>> result around; maybe a job for @ForceInline?
>> 
>> I'll experiment and analyze a bit more tomorrow to see if I can find a
>> good explanation for the observed difference and/or a solution that
>> allows us to slim down the lookup array.
>> 
>> /Claes
>> 
>> On 2018-01-29 20:38, Paul Sandoz wrote:
>>> Smaller in only the upper bound? I would an explicit upper bounds check 
>>> would dominate that of the bounds check for the array itself.
>>> 
>>> Paul.
>>> 
>>>> On Jan 29, 2018, at 11:37 AM, Claes Redestad <claes.redes...@oracle.com 
>>>> <mailto:claes.redes...@oracle.com>> wrote:
>>>> 
>>>> I ran with a smaller byte[] initially and saw about a 10% improvement from 
>>>> removing the branch, which is why I felt the superfluous bytes were 
>>>> motivated.
>>>> 
>>>> /Claes
>>>> 
>>>> Paul Sandoz <paul.san...@oracle.com <mailto:paul.san...@oracle.com>> 
>>>> skrev: (29 januari 2018 19:14:44 CET)
>>>> 
>>>> 
>>>>         On Jan 29, 2018, at 9:44 AM, Martin Buchholz
>>>>         <marti...@google.com <mailto:marti...@google.com>> wrote:
>>>>         Thanks. I might try to shrink the size of the static array,
>>>>         by only storing values between '0' and 'z', at the cost of
>>>>         slightly greater lookup costs for each char.
>>>> 
>>>>     I was wondering the same, or just clip the end of the array to’z'
>>>> 
>>>>     if (ch <= ‘z’ && radix …) { // Might even fold the upper bounds check 
>>>> for DIGITS
>>>>        value = DIGITS[ch];
>>>>        ...
>>>>     }
>>>> 
>>>>     Paul.
>>>> 
>>>>         On Mon, Jan 29, 2018 at 3:15 AM, Claes Redestad
>>>>         <claes.redes...@oracle.com
>>>>         <mailto:claes.redes...@oracle.com>> wrote:
>>>> 
>>>>             Hi, for the latin1 block of CharacterData we can improve
>>>>             the digit(int, int) implementation by providing an
>>>>             optimized lookup table. This improves microbenchmarks
>>>>             exercising Integer.parseInt, Long.parseLong and
>>>>             UUID.fromString etc by around 50%for typical inputs.
>>>>             Webrev:
>>>> http://cr.openjdk.java.net/~redestad/8196331/open.00/
>>>> <http://cr.openjdk.java.net/%7Eredestad/8196331/open.00/>
>>>>             Bug: https://bugs.openjdk.java.net/browse/JDK-8196331 The
>>>>             lookup array is pre-calculated to minimize startup impact
>>>>             (adds 1,027 bytecodes executed during initialization) /Claes
>>>> 
>>>> 
>>>> -- 
>>>> Sent from my Android device with K-9 Mail. Please excuse my brevity.
>>> 
>> 
> 

Reply via email to