我有一个大型的Java框架,它使用了大量的并行执行(线程池、Java 8流等)。当我在纯Java中使用它时,它会工作,并在计算繁重的任务中最大限度地加载我的8个内核。
现在,我为我的java类创建了一个薄Groovy包装器,以简化配置。我期望的是Groovy调用会有轻微的性能开销,但编译后的Java类的性能应该是一样的。在实践中,我看到有一个巨大的性能下降,程序只利用一个或两个核心到40-50%。当我将Groovy代码包装在GroovyShell
中并从Java main类中调用它时,一切工作正常,并且我恢复了100%的性能。
有什么问题吗?Groovy launcher是否覆盖了一些默认的线程池配置?
我使用的是Java 8,Groovy 2.4.7,并从Idea调用Groovy脚本。
发布于 2016-08-29 17:16:26
我找到问题了。它不是使用Java线程池,而是使用Groovyshell
。我在java代码中有一个GroovyShell
调用,所以当我从java调用它时,它工作得很好,但是当我从groovy调用它时,由于某种原因,它导致当前线程在另一个线程上等待GroovyShell
调用完成(即使我有不同的外壳对象)。
我包含了同步解析的脚本缓存(脚本被解析一次,然后与不同的绑定一起使用),它解决了这个问题(也极大地提高了这部分代码的性能)。
唯一的问题是,由于没有明显的方法来克隆脚本并将其分发给不同的线程,因此我需要同步调用。
https://stackoverflow.com/questions/38916917
复制相似问题