2017-04-04 74 views
2

如果在实现返回硬编码getKind的方法与在实例化期间传入的Class.class之间存在任何显着的运行时性能差异,那么我想知道何时实现返回类型的方法。Java性能运行时泛型

  1. 硬编码性能:

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

其中类型是在传入构造
  • 版。

    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; 
        } 
    } 
    
  • 我知道会有一些性能影响的实例,因为我们需要在一个领域传递以及美孚需要占用更多的内存,但我很怀疑有任何显著的运行时性能(运行时间性能只是在内存中寻找一个值,这是一直在发生的事情,因为我们不是构建在手机上运行的精确火箭或其他任何东西,所以在内存中的一次查找不会受到伤害。至少使用毫秒精度,我几乎不能检测到任何真正的差异。

    为了真正证明第一种硬编码方法是否有任何区别?考虑到硬编码方法会导致涉及大量重复的设计,而我可以简化为单一类的第二种方法。实际上,我认为实际使用的内存和性能命中并不像用于将所有重复类加载到JVM的permgen空间(或metaspace)或其他任何内容中的实际内存那样有效。

    +0

    作为一个简短的答案,并不是真的。评估性能命中率的最佳方法是查看字节码或对循环中的大量实例进行计时 - 但实际应用程序或算法中不可能是瓶颈。 –

    +0

    我认为你是对的最后一段(虽然我不是100%确定)。一个简单的getter和存储引用所需的空间,对于模拟泛化泛型而言可能比为每个变体加载单独类的方法便宜得多。 – flakes

    回答

    2

    至少使用毫秒精度我几乎不能检测到任何实际差异。

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

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

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