
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