Java Performance运行时泛型

时间:2017-04-04 22:25:34

标签: java performance

如果在实现返回硬编码的getKind的方法与在实例化期间传入的Class.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;
         }
      }
      
    2. 我知道在实例化中会有一些性能命中,因为我们需要传入一个字段以及Foo需要占用更多内存,但我高度怀疑是否存在任何重要的运行时性能(运行时性能只是看起来在内存中增加一个值,这是一直在发生的事情,因为我们没有在手机或任何东西上运行精确火箭,因此在内存中再查找一次就不会受到伤害。至少使用毫秒精度,我几乎找不到任何真正的差异。

      为了真正证明第一种硬编码方法有什么不同吗?考虑到硬编码方法会导致设计涉及大量重复,而第二种方法我可以简化为单个类。

      实际上,我认为实际使用的内存和性能损失并不像用于将所有重复类加载到JVM的permgen空间(或元空间)中的实际内存那样有影响力。或者其他什么。

1 个答案:

答案 0 :(得分:2)

  

至少使用毫秒精度,我几乎找不到任何真正的差异。

您将需要纳秒精度或更高。即0.000001毫秒

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

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