On 11/24/2015 09:08 PM, Ulf wrote:
Hi,
Am 24.11.2015 um 18:27 schrieb Peter Levart:
On 11/24/2015 06:22 PM, Peter Levart wrote:
.. for addressing DigitOnes and DigitTens it is ok and might be
faster, as you say.
If DigitOnes and DigitTens are extended for 28 ignored zero slots,
it may save the upper bound check too.
Another interesting tweak, thanks for the idea.
I think that the index of code idiomatism has reached the local
maximum and is now falling ... ;-)
Good joke, hopefully some day we have unsigned integers in Java, so
such twiddling has an end.
-Ulf
xkcd would probably illustrate it like this:
Quest for Idiomatic Code
(A play in at least N*3 acts)
act 1 - discovery...
This code is 20 years old and not very idiomatic because compilers of
that time did not know how to optimize things....
int q = i / 100;
int r = i - ((q << 6) + (q << 5) + (q << 2));
buf[--charPos] = DigitOnes[r];
buf[--charPos] = DigitTens[r];
act 2 - let's do it!
That's nicer and runs even a little faster than before...
int q = i / 100;
int r = i - 100 * q;
buf[--charPos] = DigitOnes[r];
buf[--charPos] = DigitTens[r];
act 3 - is that all we can squeeze out?
Byte addressing opcodes are even faster and we can eliminate negative
bounds check...
int q = i / 100;
byte r = (byte)((i - 100 * q) & 0x7F);
buf[--charPos] = DigitOnes[r];
buf[--charPos] = DigitTens[r];
act 4 - 20 years later - (re)discovery...
This code is 20 years old and not very idiomatic because compilers of
that time did not know how to optimize things....
int q = i / 100;
byte r = (byte)((i - 100 * q) & 0x7F);
buf[--charPos] = DigitOnes[r];
buf[--charPos] = DigitTens[r];
act 5 - let's do it!
That's nicer and runs even a little faster than before...
int q = i / 100;
int r = i - 100 * q;
buf[--charPos] = DigitOnes[r];
buf[--charPos] = DigitTens[r];
...