Java 性能运行时泛型



我想知道当您实现返回类型的方法时,实现返回硬编码的 getKind 的方法与在实例化期间传入的类.class之间是否存在任何显着的运行时性能差异。

  1. 硬编码性能:

    public static class HardcodedFoo {
    public Class<Integer> getKind() {
    return Integer.class;
    }
    }
    

  1. 在构造函数中传递类型的版本。

    public static class Foo<E> {
    private final Class<E> kind;
    public Foo(final Class<E> kind) {this.kind = kind;}
    public Class<E> getKind() {
    return kind;
    }
    }
    

我知道在实例化中会有一些性能影响,因为我们需要传入一个字段以及 Foo 需要占用更多内存,但我非常怀疑是否有任何显着的运行时性能(运行时性能只是在内存中查找一个值,这是一直在发生的事情, 在内存中再查找一次不会有什么坏处,因为我们不是在制造在手机或任何东西上运行的精确火箭)。 至少使用毫秒精度,我几乎无法检测到任何真正的差异。

真正证明第一种硬编码方法的合理性会有什么区别吗?考虑硬编码方法将导致设计涉及大量重复,而第二种方法我可以简化为单个类。

事实上,我认为实际使用的内存和性能影响不如用于将所有重复类加载到 JVM 的 permgen 空间(或元空间)或其他空间的实际内存那样具有影响力。

至少使用毫秒精度,我几乎无法检测到任何真正的差异。

您将需要纳秒级或更高的精度,即 0.000001 毫秒

正如您所注意到的,主要区别在于附加字段。 这可能会对大小产生影响,但由于对象通常为 8 字节对齐,引用通常为 4 个字节,因此引用可能会消耗填充并且不会添加对象大小。

所涉及的内存访问可能会增加一些时间,但由于此时将访问标头,因此访问 L1 缓存中的其他字段。 即它通常会增加 ~1 ns。

最新更新