[armedbear-devel] Some Array vs GETFILED access times
logicmoo at gmail.com
logicmoo at gmail.com
Mon Nov 2 01:48:14 UTC 2009
ABCL,
For implementing MOP-like objects these times are something to consider.
What I draw from it is when not messing with arrays (array bounds checking).
Every case is better than.
JVM-L,
Do these tests with times make sense?
package ArrayTests;
public class ArrayVsClass {
public static void main(String[] args) {
long lVectorStartTime = System.currentTimeMillis();
int iterations = Integer.MAX_VALUE;
while (iterations-- > 0) {
// int iterations2 = 10;
//while (iterations2-- > 0)
{
//testArray(); // ARRAY
// vs
//testGETFIELD(); // GETFIELD
// vs
testIBean(); // INVOKE INTERFACE
// vs
//testBean(); // INVOKE VIRTUAL
// vs
//testABean(); // INVOKE VIRTUAL POSSIBLY THROW
// vs
//testSlots(); // INVOKE FOR AVALUE
}
}
long lVectorRunTime = System.currentTimeMillis() - lVectorStartTime;
System.out.println("Bench time: " + lVectorRunTime);
}
// SLOTS time: 33157,33250,33156
public static void testSlots() {
ClassWithSlots oneSlot = new ClassWithSlots(6);
int iterations = Integer.MAX_VALUE;
long result = 0;
while (iterations-- > 0) {
result += oneSlot.getValue();
}
}
// Array time: 18438,18437,18422
public static void testArray() {
final long[] accessArray = new long[] { 6 };
int iterations = Integer.MAX_VALUE;
long result = 0;
while (iterations-- > 0) {
result += accessArray[0];
}
}
// GETFIELD time: 14688,14531,14453
public static void testGETFIELD() {
ClassWithOneSlot oneSlot = new ClassWithOneSlot(6);
int iterations = Integer.MAX_VALUE;
long result = 0;
while (iterations-- > 0) {
result += oneSlot.slot;
}
}
// INVOKE VIRTUAL time: 14750,14594,14719
public static void testBean() {
ClassWithOneSlot oneSlot = new ClassWithOneSlot(6);
int iterations = Integer.MAX_VALUE;
long result = 0;
while (iterations-- > 0) {
result += oneSlot.getValue();
}
}
// INVOKE INTERFACE time: 14469,14610,14859
public static void testIBean() {
IBeanWithOneSlot oneSlot = new ClassWithOneSlot(6);
int iterations = Integer.MAX_VALUE;
long result = 0;
while (iterations-- > 0) {
result += oneSlot.getValue();
}
}
// INVOKE VIRTUAL POSSIBLY THROW time: 14641,14594,14547
public static void testABean() {
AClassWithOneSlot oneSlot = new ClassWithOneSlot(6);
int iterations = Integer.MAX_VALUE;
long result = 0;
while (iterations-- > 0) {
result += oneSlot.getValue();
}
}
static interface IBeanWithOneSlot {
public long getValue();
}
static class ClassWithOneSlot extends AClassWithOneSlot implements IBeanWithOneSlot {
final public long slot;
ClassWithOneSlot(long s) {
slot = s;
}
@Override
final public long getValue() {
return slot;
}
}
static class ClassWithSlots {
final public long[] slots = new long[1];
ClassWithSlots(long s) {
slots[0] = s;
}
final public long getValue() {
return slots[0];
}
}
static abstract class AClassWithOneSlot implements IBeanWithOneSlot {
@Override
public long getValue() {
throw new NullPointerException();
}
}
}
More information about the armedbear-devel
mailing list