对于简单的类定义:
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 performance和Faster alternatives to Java's reflection的答案进行比较)。谁能证实我的推测?造成这种差距的原因是什么?
非常感谢您的任何见解。
答案 0 :(得分:1)
对于方法调用Scala reflection uses Java reflection,所以它几乎不会更快。
Scala反射似乎更快(请参阅Scala TypeTags的答案和性能以及更快的Java替代方案以进行比较)
如果你只是比较这些数字,Scala反射似乎要慢得多:Java需要大约0.4秒才能进行5000万次迭代,Scala需要大约0.01秒进行100次迭代。
但是当然你根本无法比较这些数字:它们是在不同的计算机上完成的,具有不同的设置,不同的JVM版本,不同的热身,Scala每次在Java获取它时都会查找该方法多次调用,测量的方法不同等等。