我有一些已经编译成JAR的预先存在的java代码。这包含在Scala项目的类路径中,我从Scala调用了一些java方法。这是在Java 1.7,Scala 2.11.2和Eclipse中的Scala IDE中。
示例:
def step[Ctx] = Locality.stepFn[SubProblemBSolution, Ctx] { (x : SubProblemBSolution) => x.mutate }
这里,SubProblemBSolution是一个带有mutate()方法的java类。其余的是Scala。这个方法已经在java中运行了很长时间(1000次运行时平均大约0.5s),但是从Scala调用它需要大约2.5s才能完成。
不会为scala重新编译jar,我只是调用现有的编译类。我尝试反编译scala .class文件以查看它们是否调用奇怪的东西,但它们只有/ 编译代码 /其中对java代码的调用是。
知道为什么这可能会这么慢?我可以做些什么来改善这种状况吗?
感谢。
答案 0 :(得分:1)
如何使用Scala进行调用很重要。
特别是避免使用对象和静态初始化器。也就是说,避免将昂贵的计算作为对象的构造函数的一部分运行,该对象在类初始化期间运行。这往往是不优化的。
答案 1 :(得分:0)
有点令人沮丧的是,通过在Scala IDE中创建一个新项目并重新导入所有内容来解决这个问题。即使然后将这个新项目导入Eclipse,对Java方法的调用也会全速运行。在查看这两个项目时,我看不出任何明显不同的东西(包括差异化它们的.classpath和.project文件),但是在配置的某个地方肯定会有潜伏的东西。
我尝试删除一些静态引用,这些引用似乎根据@ som-snytt的答案做了一些改进 - 但最大的区别来自于制作一个新项目。