RFR (S) CR 8006627/8007398: Improve performance of Long.toUnsignedString0, Integer.toUnsignedString0, UUID(String) and UUID.toString
Ulf Zibis
Ulf.Zibis at CoSoCo.de
Wed Feb 13 02:25:54 UTC 2013
Am 13.02.2013 02:34, schrieb Mike Duigou:
> Thank you for the comments Ulf.
>
> On Feb 12 2013, at 17:24 , Ulf Zibis wrote:
>
>> Am 13.02.2013 00:30, schrieb Mike Duigou:
>>> Hi Steven;
>>>
>>> I have updated the patch for Java 8. There's somewhat less code sharing and a bit of refactoring than your last version but the performance should be about the same or a little better.
>>>
>>> http://cr.openjdk.java.net/~mduigou/JDK-8007398/0/webrev/
>> Couldn't you use String(buf, true) for all to(Unsigned)String(...) methods ?
> Possibly. I didn't go looking too far with looking for additional improvements.
>
>> Instead of calculating the mask each time, you could use:
>> 309 private static String toUnsignedString(int i, int shift, int mask) {
> I think that would actually be inefficient. I haven't looked at the JITed code but the mask calculation is pretty cheap relative to parameter passing.
I believe, JIT will inline the code, so there would be no parameter passing.
Additionally the calculation of char count could be faster, if you would have short cuts like:
numberOfLeading2Zeros(i)
numberOfLeading4Zeros(i)
numberOfLeading8Zeros(i)
...
So the optimum would be with separate toString methods:
String toBase2String(int i);
String toBase4String(int i);
String toBase8String(int i);
...
In any case I would save 2 lines:
311 int mag = Integer.SIZE - Long.numberOfLeadingZeros(i);
312 int charCount = Math.max(((mag + (shift - 1)) / shift), 1);
313 char[] buf = new char[charCount];
316 int mask = (1 << shift) - 1;
-Ulf
More information about the core-libs-dev
mailing list