Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java性能运行时泛型_Java_Performance - Fatal编程技术网

Java性能运行时泛型

Java性能运行时泛型,java,performance,Java,Performance,我想知道当您实现一个返回类型的方法时,在实现一个返回硬编码getKind的方法和一个在实例化过程中传入的Class.Class之间,是否存在任何显著的运行时性能差异 硬编码性能: public static class HardcodedFoo { public Class<Integer> getKind() { return Integer.class; } } 公共静态类HardcodedFoo{ 公共类getKind(){ 返回I

我想知道当您实现一个返回类型的方法时,在实现一个返回硬编码getKind的方法和一个在实例化过程中传入的Class.Class之间,是否存在任何显著的运行时性能差异

  • 硬编码性能:

     public static class HardcodedFoo {
    
         public Class<Integer> getKind() {
             return Integer.class;
         }
     }
    
    公共静态类HardcodedFoo{
    公共类getKind(){
    返回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;
       }
    }
    
    公共静态类Foo{
    私人最终类;
    public Foo(最终类种类){this.kind=kind;}
    公共类getKind(){
    回报类;
    }
    }
    
  • 我知道在实例化中会有一些性能问题,因为我们需要传入一个字段,而Foo需要占用更多内存,但我高度怀疑是否有任何显著的运行时性能(运行时性能只是在内存中查找一个值,这是经常发生的事情,在内存中再查找一次不会有什么坏处,因为我们没有在手机或任何东西上构建运行的精确火箭)。至少使用毫秒精度,我几乎无法检测到任何真正的差异

    第一种硬编码方法是否有任何区别?考虑到硬编码方法会导致设计涉及大量重复,而第二种方法我可以简化为单个类

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

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

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

    正如您所注意到的,主要区别在于附加字段。这可能会对大小产生影响,但由于对象通常是8字节对齐的,而引用通常是4字节,因此引用可能会使用填充,而不会添加任何内容来调整对象大小


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

    作为简短回答,不是真的。评估性能影响的最佳方法是查看字节码或对大量数据进行计时循环中的实例化-但它不太可能成为实际应用程序或算法中的瓶颈。我认为你在最后一段是对的(尽管我不是100%确定)。一个简单的getter和它用来存储引用的空间,对于模拟具体化泛型来说,可能比为每个变量加载单独类的方法要便宜得多。