Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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
从scala调用的Java方法运行缓慢_Java_Performance_Scala - Fatal编程技术网

从scala调用的Java方法运行缓慢

从scala调用的Java方法运行缓慢,java,performance,scala,Java,Performance,Scala,我有一些预先存在的java代码,已经编译成JAR。这包含在Scala项目的类路径中,我正在调用Scala中的一些java方法。这是在Java1.7、Scala2.11.2和Eclipse中ScalaIDE中实现的 例如: def step[Ctx]=Locality.stepFn[SubProblemBSolution,Ctx]{(x:SubProblemBSolution)=>x.mutate} 这里,SubProblemBSolution是一个带有mutate()方法的java类。其余的是

我有一些预先存在的java代码,已经编译成JAR。这包含在Scala项目的类路径中,我正在调用Scala中的一些java方法。这是在Java1.7、Scala2.11.2和Eclipse中ScalaIDE中实现的

例如:

def step[Ctx]=Locality.stepFn[SubProblemBSolution,Ctx]{(x:SubProblemBSolution)=>x.mutate}
这里,SubProblemBSolution是一个带有mutate()方法的java类。其余的是Scala。这个方法已经在java中长期运行(大约0.5s,平均超过1000次运行),但是从Scala调用它需要大约2.5s才能完成

没有为scala重新编译jar,我只是调用现有的编译类。我尝试对scala.class文件进行反编译,看看它们是否调用了奇怪的东西,但它们只有/compiled code/对java代码的调用

你知道为什么运行得这么慢吗?我能做些什么来改善这种情况吗


谢谢。

您从Scala打电话的方式很重要

尤其要避免使用对象和静态初始值设定项。也就是说,避免将昂贵的计算作为对象构造函数的一部分运行,该构造函数在类初始化期间运行。这往往是非优化的


旧的问题,尤其是旧的问题是有症状的。

令人沮丧的是,通过在Scala IDE中创建一个新项目并重新导入所有内容,这个问题得到了解决。即使在将这个新项目导入Eclipse时,对Java方法的调用也会全速运行。在查看这两个项目(包括区分它们的.classpath和.project文件)时,我看不出有什么明显的不同,但在某个配置中肯定隐藏着某种东西


我尝试删除一些静态引用,根据@som snytt的回答,这些静态引用似乎有一些改进,但最大的区别在于创建了一个新项目。

完全没有理由认为它应该运行缓慢,因为在运行时它们只是类似的字节码。我怀疑当类加载器第一次加载它并说它加载了一些本机库时,第一次使用它可能需要一些时间。滚动到页面底部,直到看到“Live Demo”。您确定要将相同的值传递给函数吗?喜欢解决同样的问题吗?如何度量方法运行时间?有很多诀窍可以正确地完成它,所以唯一简单的正确方法就是使用“谢谢”这个词@ziggystar肯定是要解决同样的问题。我也试过几个问题的例子,以防它是针对那个问题的。谢谢。这可能就是问题所在。有一些静态代码是可以避免的,mutate()也会创建一个x的副本,然后在返回之前应用一些更改。我将关注这些,并很快更新进展情况。