Java独立变量vs数组性能

我正在玩 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);
    }
}

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...