I've seen that JITC uses unsigned comparison for checking array bounds (the test 0 <= x < LIMIT
is equivalent to 0 ≺ LIMIT
where ≺
treats the numbers as unsigned quantities). So I was curious if it works for arbitrary comparisons of the form 0 <= x < LIMIT
as well.
The results of my benchmark are pretty confusing. I've created three experiments of the form
for (int i=0; i<LENGTH; ++i) {
int x = data[i];
if (condition) result += x;
}
with different conditions
0 <= x
calledabove
x < LIMIT
calledbelow
0 <= x && x < LIMIT
calledinRange
0 <= x & x < LIMIT
calledinRange2
and prepared the data so that the probabilities of the condition being true are the same.
The results should be fairly similar, just above
might be slightly faster as it compares against zero. Even if the JITC couldn't use the unsigned comparison for the test, the results for above
and below
should still be similar.
Can anyone explain what's going on here? It's quite possible that I did something wrong...
Update
I'm using Java build 1.7.0_51-b13 on Ubuntu 2.6.32-54-generic with i5-2400 CPU @ 3.10GHz, in case anybody cares. As the results for inRange
and inRange2
near 0.00
are especially confusing, I re-ran the benchmark with more steps in this area.