速度优化:私有和公共变量 - Java

Hid*_*dde 5 java variables performance

我问这个问题纯粹是为了问题的速度方面.

从私有或公共(Java)获取对象的值之间的速度差异是什么?

class MyClass {
    public int myInt = 5;
}
class MyOtherClass {
    private int myInt = 5;

    public int getMyInt() {
        return myInt;
    }
}
class MyMainClass {
    public static void main (String [] args) {
        MyClass myObject = new MyClass();
        MyOtherClass myOtherObject = new MyOtherClass();

        // which is faster?
        System.out.println(myObject.myInt);
        System.out.println(myOtherObject.getMyInt ());
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以测试它,但如果有人知道它,它不会伤害:)提前谢谢!

cor*_*iKa 9

公共和私有访问只不过是在编译时确定您是否可以访问变量.在运行时,它们完全相同.这意味着如果您可以欺骗JVM认为您有权访问(通过反射,不安全或修改字节码),那么您可以.公共和私有只是编译时间信息.这并不是说它不会存储在字节码中,因为它确实存在,但只有在某些东西试图针对它进行编译时才可以引用它.


eri*_*son 9

字段上的访问修饰符不会对速度产生任何影响,但调用访问器方法有所不同.

但是,差异并不大,并且由于JIT编译器优化而在重复调用之后可能会减少.这取决于你的情况,但我没有发现性能问题证明消除访问器的合理性.让良好的设计原则推动您的决策.

在这种情况下有助于提高性能的一个好的设计原则是禁止继承,除非您知道需要继承并已采取措施来支持它.特别是,声明类final(或至少是访问器方法)将提供更快的方法调度,并且还可以作为JITC的提示,以更加积极地内联.

保持访问者最终还允许编译器内联对访问者的调用.如果该字段是私有的,则可以内联从类中调用访问者(并且在良好的设计中,这些是最常见的情况),而包可访问字段可以在整个包中内联等.