Java 自变量 vs 数组性能

标签 java arrays optimization

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

相关文章:

javascript - jquery 每个 json 对象不执行任何操作

java - 忙碌的等待, sleep 和准确性

javascript - 动态推送基于每一行输入的数组

java - 无法将 Spring Data MongoDB + Spring DataJPA 与 SpringBoot 一起使用

java - 在java中禁用回声

c - 错误: return value type does not match the function type

performance - 系统范围的分析器(例如 perf)如何将计数器与指令相关联?

java - 使用camera2拍照时如何获得曝光时间?

java - 在 BigDecimal 中使用 setScale

java - 如何摆脱以下程序中的 NumberFormatException?