通过Java Reflection / Scala反射调用实例方法:哪一个更快?

时间:2016-07-07 22:45:27

标签: java performance scala reflection

对于简单的类定义:

class Example {

  def r() = Random.nextLong() + Random.nextLong() //I'm using scala utility class to be succinct
}

当“示例”类和函数名“fn”都是动态的时,有两种方法可以调用r(),但在编译时已经知道(这可以最大限度地减少重复调用“fn”的开销):Java Reflection& ;斯卡拉反思。

Java Reflection有一个更简单的API:您只需使用Class.getMethodWithParameterType来获取反射方法,它就可以立即应用于Example类的任何实例。

Scala反射更复杂:对于Example类的每个实例,您需要先获取实例镜像,然后使用它来调用该方法。

令我惊讶的是,即使有这么复杂,Scala Reflection似乎也更快(请参阅Scala TypeTags and performanceFaster alternatives to Java's reflection的答案进行比较)。谁能证实我的推测?造成这种差距的原因是什么?

非常感谢您的任何见解。

1 个答案:

答案 0 :(得分:1)

对于方法调用Scala reflection uses Java reflection,所以它几乎不会更快。

  

Scala反射似乎更快(请参阅Scala TypeTags的答案和性能以及更快的Java替代方案以进行比较)

如果你只是比较这些数字,Scala反射似乎要慢得多:Java需要大约0.4秒才能进行5000万次迭代,Scala需要大约0.01秒进行100次迭代。

但是当然你根本无法比较这些数字:它们是在不同的计算机上完成的,具有不同的设置,不同的JVM版本,不同的热身,Scala每次在Java获取它时都会查找该方法多次调用,测量的方法不同等等。