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

时间:2011-09-09 17:34:23

标签: java performance variables

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

从私有或公共(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 ());
    }
}

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

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:1)

据我所知,当你调用一个getter或任何只会返回一些值的函数时,这个方法将被内联,所以方法调用和字段的直接访问之间没有任何区别

答案 3 :(得分:1)

您询问有关访问私有变量和公共变量的信息,但您的代码示例和对glowcoder的评论暗示您确实询问私有字段与公共方法(或者,字段与方法......正如辉光编码器所说,公共与私有对性能没有影响。)

许多现代编译器会优化对short方法的调用,以等同于访问它们所包含的字段(通过内联调用),但完全有可能给定的Java环境将执行函数调用(这稍微慢一些)调用方法。

由特定的编译器决定是生成内联代码还是函数调用。由于缺乏您正在使用的java编译器(以及可能的编译器选项)的知识,因此无法确定。

答案 4 :(得分:0)

从表现的角度来看,差异是无穷小的,如果有任何差异的话。编译器将几乎完全相同地优化此代码,并且一旦代码被编译,JVM将以完全相同的方式处理公共和私有变量(我不相信它甚至知道公共和私有后的区别 - 编译)。

从务实的角度来看,很难想象任何可能出于性能目的打破传统Java属性访问模式的场景。在StackOverflow上就C ++的这个主题提出了类似的问题,答案与Java相关:

Any performance reason to put attributes protected/private?