gpt4 book ai didi

Java 自变量 vs 数组性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:32 27 4
gpt4 key购买 nike

我正在研究 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com