Dang.. yup and performance tests showed the same time for both: 1843/1844
The only time it doesn't do bounds check is when the new (even multidemensional) array data is in the constant table.. and that cant happen with passed in args.
package ArrayTests;
public class AASTOREvsNEWARRAY {
/** * @param args */ public static void main(String[] args) { long lVectorStartTime = System.currentTimeMillis(); testAALoad(); long lVectorRunTime = System.currentTimeMillis() - lVectorStartTime; System.out.println(" time: " + lVectorRunTime); }
// time: 1843 public static void testAALoad() { final Object testObject = new Object(); int iterations = Short.MAX_VALUE<<10; long result = 0; while (iterations-- > 0) { final Object[] accessArray = new Object[20]; accessArray[0] = testObject; accessArray[1] = testObject; accessArray[2] = testObject; accessArray[3] = testObject; accessArray[4] = testObject; accessArray[5] = testObject; accessArray[6] = testObject; accessArray[7] = testObject; accessArray[8] = testObject; accessArray[9] = testObject; accessArray[10] = testObject; accessArray[11] = testObject; accessArray[12] = testObject; accessArray[13] = testObject; accessArray[14] = testObject; accessArray[15] = testObject; accessArray[16] = testObject; accessArray[17] = testObject; accessArray[18] = testObject; accessArray[19] = testObject; passIt(accessArray); } }
// time: 1844 public static void testANEWARRY() { final Object testObject = new Object(); int iterations = Short.MAX_VALUE<<10; long result = 0; while (iterations-- > 0) { final Object[] accessArray = new Object[] { testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject, testObject }; passIt(accessArray); } }
static void passIt(Object[] accessArray) { // fake some use so no jit empty method emimination int i = accessArray.length; }
}
----- Original Message ----- From: "Alessio Stalla" alessiostalla@gmail.com To: dmiles@users.sourceforge.net Cc: "Armed Bear" armedbear-devel@common-lisp.net Sent: Thursday, December 03, 2009 12:32 PM Subject: Re: [armedbear-devel] AASTORE Removal - Bounds checking
On Thu, Dec 3, 2009 at 9:24 PM, logicmoo@gmail.com wrote:
With the execute(...) functions in Primitive.java
@Override public LispObject execute(LispObject first, LispObject second, LispObject third)
{ LispObject[] args = new LispObject[3]; args[0] = first; args[1] = second; args[2] = third; return execute(args); }
Should probably be transformed to
@Override public LispObject execute(LispObject first, LispObject second, LispObject third)
{ return execute(new LispObject[]{first,second,third}); }
To remove the redundant bounds checking of AASTORE
I believe that javac translates the second method to the exact same code as the first. Bounds checking can't be eliminated in Java as far as I know.
Alessio