我正在研究 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 data2, int data3, 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, 2, 3, 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);
}
}
关于Java 自变量 vs 数组性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23291448/