我正在玩
Java并且想知道以下在性能方面有多么不同.我知道过早优化是编程的困境,但我的好奇只是为了将来的参考.
public class Type1{ int[] data = new data[4]; public int getData( int index ){ return data[index]; } } public class Type2{ int data1; int data2; int data3; int data4; public int getData1(){ return data1; } public int getData2(){ return data2; } public int getData3(){ return data3; } public int getData4(){ return data4; } }
可以理解的是,有许多因素可能会有所不同,但必须以某种方式表现出一些明显的表现.显然类Type1在设计方面是一个更有吸引力的解决方案,但它似乎在检索数据时有一个额外的步骤,即进入一个数组以获得一个int,而不是Type2直接为数据.如果它们持有Class对象数组,则差异可能更明显,因为它可能会保证Java使用数组成员的引用.我完全没球了吗?
解决方法
与API使用差异的影响相比,两种方法之间的运行时速度差异肯定是微不足道的.
但是,如果我们重新安排事情以使两者的API相同,那么我们发现运行时速度差异确实可以忽略不计.以下代码时间均为两种方法,两者均为~13秒.您的结果可能不同.
可能值得查看字节码,看看编译器是否已经优化了大部分差异.
public class Program { public static interface Type { int getData1(); int getData2(); int getData3(); int getData4(); } public static class Type1 implements Type { private int[] data; public Type1(int data1,int data2,int data3,int data4) { data = new int[] { data1,data2,data3,data4 }; } @Override public int getData1() { return data[0]; } @Override public int getData2() { return data[1]; } @Override public int getData3() { return data[2]; } @Override public int getData4() { return data[3]; } } public static class Type2 implements Type { private int data1; private int data2; private int data3; private int data4; public Type2(int data1,int data4) { this.data1 = data1; this.data2 = data2; this.data3 = data3; this.data4 = data4; } @Override public int getData1() { return data1; } @Override public int getData2() { return data2; } @Override public int getData3() { return data3; } @Override public int getData4() { return data4; } } public static void main(String[] args) { timeType(new Type1(1,2,3,4)); timeType(new Type2(1,4)); } private static void timeType(Type type) { long start = System.currentTimeMillis(); int total = 0; for (long i = 0; i < 10000000000l; i++) { total += type.getData1(); total += type.getData2(); total += type.getData3(); total += type.getData4(); } System.out.println(total); System.out.println(System.currentTimeMillis() - start); } }