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

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

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

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

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

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

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

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

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

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

你问关于访问私有变量和公共变量,但你的代码示例和对glowcoder的评论暗示你真的在询问私有字段与公共方法 (或者字段与方法……正如glowcoder正确地说的那样,public vs.私人对绩效没有影响)。

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

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

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

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

将属性保护/私有的任何性能原因?