Much thanks for your comments John.

The in bug 6984886 mentioned isHigh/LowSurrogate methods are frequently used in small loops of charset de/encoders, so I expect a measurable performance improvement there.

-Ulf


Am 06.09.2014 um 01:25 schrieb John Rose:
On Aug 30, 2014, at 7:17 AM, Ulf Zibis <ulf.zi...@cosoco.de> wrote:

Am 30.08.2014 um 01:33 schrieb John Rose:
On Aug 29, 2014, at 1:05 PM, Ulf Zibis <ulf.zi...@cosoco.de 
<mailto:ulf.zi...@cosoco.de>> wrote:

Thanks for explaining this, but a very little nit: the immediate (I.e. -1) uses 
additional 32/64 bits in code which must be loaded from memory and wastes space in 
CPU cache or am I wrong? This could be saved with >= 0.
I have to say you're more wrong than right about this.  Optimizers routinely change the form of constants.  For example, a constant 0 will often 
show up as something like "xor eax,eax", not a 32-bit literal zero that loads from somewhere in memory.  A comparison of the form 
"x > -1" will be freely changed to "x >= 0" and back again; the latter form may (or may not, depending on chip version) 
transform to "test eax", with no "-1" or "0" in sight.
1. Thanks for the hint about "x > -1" ===> "x >= 0". But I'm afraid this would apply on 
the "x != -1" case we are discussing here.
The equality comparison would be less likely to transform to a non-equality comparison.  But 
it is still possible in principle, if the JIT could prove that values "x < -1" 
are impossible.

2. Are you really sure this optimization is always implemented, as following 
bug is still open:
JDK-6984886 : Transform comparisons against odd border to even border 
<http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6984886>
Well, I'm pretty sure that no optimizations is "always" implemented; there are 
usually corner cases which prevent optimizations.  There is always a possibility of 
deoptimization to the interpreter, for example.  And there are lots of nice-to-have 
optimizations that don't make a difference to real applications.  Much of compiler 
development is driven by observing actual speed bottlenecks and removing them.

But the bug reference is useful; thanks!  I added a comment to show where the optimization occurs 
now—disappointingly little I grant you—and where to start looking to improve it.  The bug is rated P5 (lowest 
rating) probably because the reporter said "it should be faster"; "wouldn't this be nice" 
is a far weaker argument than "I'm spending too much on hardware because this loop is slow".

My comments about the unpredictability of optimizers still stand.  The most 
robust way to manage such problems is, first confirm it is a real performance 
problem (not a micro-nano thing), and second get the optimizer to make all 
equivalent inputs produce good code.  The tiny place where this optimization is 
done in HotSpot suggests that that was a place where the transform actually 
mattered the most.

— John

Reply via email to