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

速度优化:私有和公共变量-Java,java,performance,variables,Java,Performance,Variables,我问这个问题纯粹是为了这个问题的速度方面 当对象是私有对象或公共对象(Java)时,从对象获取值的速度有什么不同 我知道我可以测试它,但如果有人真的知道,它不会伤害:) 提前谢谢 公共和私有访问只不过是在编译时确定您是否有权访问变量。在运行时,它们完全相同。这意味着,如果您可以欺骗JVM,使其认为您具有访问权限(通过反射、不安全或修改字节码),那么您就可以。公共和私有只是编译时的信息。这并不是说它不会被存储在字节码中,因为它会被存储在字节码中,但只有这样,当有东西试图对它进行编译时,它才能被引用

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

当对象是私有对象或公共对象(Java)时,从对象获取值的速度有什么不同

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

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

据我所知,当你调用getter或任何只返回某个值而不返回其他值的函数时,此方法将内联,因此方法调用和字段的直接访问之间没有任何区别。

您询问访问私有变量和公共变量,但您的代码示例和对glowcoder的注释提示您真正询问的是私有字段和公共方法(或者,字段与方法……正如glowcoder正确地说的,公共与私有对性能没有影响)

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


是否生成内联代码或函数调用取决于特定的编译器。由于不知道您使用的是哪种java编译器(可能还有哪些编译器选项),因此无法确定。字段上的访问修饰符在速度上没有任何差异,但调用访问器方法会产生差异

但是,差别不大,而且由于JIT编译器的优化,在重复调用之后可能会减小。这取决于您的情况,但我还没有发现性能问题可以证明取消访问器是合理的。让好的设计原则来驱动您的决策

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


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

从性能角度来看,如果有任何差异,差异是无穷小的。编译器将以几乎相同的方式优化此代码,并且一旦代码被编译,JVM将以sa的方式处理公共和私有变量me way(我相信它甚至不知道公共和私人后期编辑之间的区别)

从语用的角度来看,很难想象任何可能的情况下,为了实现性能,它都是打破传统java属性访问模式的。在C++中,StAcQuoT上也有类似的问题,答案和java一样:


调用函数的麻烦根本不重要?@Hidde:JIT启动后,它很容易内联调用。即使没有,也有一百万件事情可以优化到更大的效果,而不会改变更糟糕的设计。实际上,在这种情况下,可能不会。编译器可能会对它进行内联。对于一个非平凡的方法,是的,一个方法调用将导致一个小的性能损失,但是对于一个getter方法,你不太可能有一个超过几行的方法。谢谢:)我实际上完全忘记了内联函数。只有当方法是
final
时,它才会被编译器内联,并且内联访问不会违反访问控制。否则,它必须等到运行时。您应该测试它。你不应该在一个大的程序上进行微基准测试,它实际上做了一些有用的工作,让它运行一分钟,因为这是优化最重要的方面。每次你考虑微观优化时都要这样做,直到你的思维过程中不再浪费能量。@delnan,我不知道你说的是什么意思。如果您的意思是,在大型程序的上下文中,
特定的
优化可能有无法衡量的好处,这在某种程度上是正确的。一个特殊编码的测试,在对哪种方法更好的普遍适用的理解方面,是否仍然是有用的?当然,由于不知道内存管理函数何时运行等,您可能需要进行长时间的迭代。我认为不需要一个真正工作的实际程序。@broiyan:如果它只对微基准点有任何(相关)效果,那么实际解决问题的程序就不会从中受益。如果它不能加快解决实际问题的速度,那么它就等于零,不值得担心。没人在乎它是否能让你的微基准跑得更快。如果存在技术深度(例如,由于封装较少而导致设计更差),则会出现三次。值得担心和实施的优化带来了可测量的好处,即使是在现实世界中做了大量其他事情的程序中也是如此(记住80-20法则!)。许多好的智慧之珠都是大+1。设计原则>性能(特别是像这样的微优化)是一个o
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 ());
    }
}