On 05/01/2012 12:09 AM, Ulf Zibis wrote:
Hi Rémi,Am 28.04.2012 00:42, schrieb Rémi Forax:While you are there:IntegerCache.cache/high/low are static final, so should be named _upper case_.Not done because the system property is also spelled in lower case.Hm, but does that justify violating very common code conventions? IMO it's inconvenient while reading the code.
Yes and no. I agree that it's again the code convention but I think that it better outline the relation with the system property.Given that all IDEs can be tweaked to display static finals with a different color/stroke,
I think this code should not be changed.
1. Compare against 0 is little faster than against a constant which must be loaded as operand.Another optimization: public static Integer valueOf(int i) { if (i >= 0) { if (i <= IntegerCache.HIGH) return IntegerCache.POS[i]; } else { if (i >= IntegerCache.LOW) return IntegerCache.NEG[~i]; } return new Integer(i); }Can you explain a little bit more why it's more efficient ?
Ok, less bytecode but no impact when JITed
2. As positive arguments should be more frequent, my version prevents
from calculating the index every time:
IntegerCache.cache[i + (-IntegerCache.low)]
I believe the JIT can emit a mov in that case, I will check.
3. Client VM would profit from less bytecode instructions to go through, as there is less inlining.
Again, I need to test.
Given that low and high are constant for the JIT, I'm not sure the current codedo bounds checking at all.I do not understand this. 'i' is not constant, so should be checked.
I was thinking about the array bound checking.
========================================== We must be careful with Integer.MAX_VALUE as maximum array size. See: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7153247 and: java.lang.AbstractCollection.MAX_ARRAY_SIZE
This one is another bug, but you will have trouble with Integer.MAX_VALUE - (-low).
Rémi
Additionally, I think, *the assert is superfluous at all*, as 'high' can never be smaller than 127.You can see this, if you compact the code: static { // high value may be configured by property String cacheHigh =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");/********** no need for variable i : **********/ int h = 127; if (cacheHigh != null) { h = Math.max(parseInt(cacheHigh), 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(h, Integer.MAX_VALUE - (-low)); /********** little shorter : **********/ // Maximum array size is Integer.MAX_VALUE h = Math.min(Integer.MAX_VALUE - (-low), Math.max(parseInt(cacheHigh), 127)); } high = h; /********** more simple : **********/ int h = 0; if (cacheHigh != null) { // Maximum array size is Integer.MAX_VALUE h = Math.min(Integer.MAX_VALUE - (-low), parseInt(cacheHigh)); } high = Math.max(h, 127); /********** no need for variable h : **********/ if (cacheHigh != null) // Maximum array size is Integer.MAX_VALUE high = Math.min(Integer.MAX_VALUE - (-low), Math.max(parseInt(cacheHigh), 127)); else high = 127; /********** shorter : **********/ high = (cacheHigh == null) ? 127 : // Maximum array size is Integer.MAX_VALUE Math.min(Integer.MAX_VALUE - (-low), Math.max(parseInt(cacheHigh), 127)); /********** most short : **********/ // Maximum array size is Integer.MAX_VALUE high = Math.max(127, Math.min((cacheHigh == null) ? 127 : parseInt(cacheHigh), Integer.MAX_VALUE - (-low))); assert IntegerCache.high >= 127; // range [-128, 127] must be interned (JLS7 5.1.7) cache = new Integer[(high - low) + 1]; for(int j = low, k = 0; k < cache.length; k++, j++) cache[k] = new Integer(j); } -Ulf
