java - 私有(private)方法内联

标签 java scala jvm inline

在 Scala 中 immutable Vector code有一条评论说:

In principle, most members should be private. However, access privileges must be carefully chosen to not prevent method inlining

  1. private 对内联决策有何影响?
  2. 这也适用于 Java 吗?

最佳答案

这通常不适用于 Java。访问检查在 Resolution 期间仅执行一次过程。当 Java 方法被 JIT 编译时,符号引用已经被解析和验证。事实上,内联不是在原始字节码上执行的,而是在特定于编译器的中间表示上执行的。因此,访问修饰符通常不会产生性能副作用。

但是,我可以编写一个人工测试用例,其中 private/public 修饰符会显着影响性能:

public class Test {
    static final Inner inner = new Inner();

    static class Inner {
        int x = 1;

        int getX1() { return x; }
        int getX2() { return getX1(); }
        int getX3() { return getX2(); }
        int getX4() { return getX3(); }
        int getX5() { return getX4(); }
        int getX6() { return getX5(); }
        int getX7() { return getX6(); }
        int getX8() { return getX7(); }
        int getX9() { return getX8(); }

        private int getPrivate() { return getX9(); }
        public int getPublic() { return getX9(); }
    }

    @GenerateMicroBenchmark
    public int inlinePrivate() {
        return inner.getPrivate();
    }

    @GenerateMicroBenchmark
    public int inlinePublic() {
        return inner.getPublic();
    }
}

Benchmark                Mode Thr    Cnt  Sec         Mean   Mean error    Units
b.Test.inlinePrivate    thrpt   1      3    5   289480,928     2247,656 ops/msec
b.Test.inlinePublic     thrpt   1      3    5  1157970,245    18473,139 ops/msec

此效果由合成方法 access$000 解释,javac 生成该方法以允许访问内部类的私有(private)成员。在上面的测试用例中,这个额外的访问器阻止了内联,因为 HotSpot 中默认的最大内联级别是 9 (-XX:MaxInlineLevel=9)。由于 getPrivate() 不能直接从外部类调用,额外的 access$000() 方法进行第 10 级调用,因此不是内联的。

关于java - 私有(private)方法内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23268120/

相关文章:

java - 自定义注解、可插拔注解处理和AOP(面向方面​​编程)之间的根本区别是什么?

java - Android 移动物体进行触摸

scala - 作为参数传递的空参数函数

java - Kotlin lambda 主体中的 `it` 是什么?

java - 扩展 JIRA 中现有的组件类

java - 在java中编辑只读文件

json - 使用 Json.format 没有可用的 MyClass 隐式格式

scala - 我是否需要将单例对象的成员导入其在 Scala 中的伴生类中?

java - 如何减少JVM虚拟内存的使用?

java - Java使用什么堆实现?