Scala 2.10编译器在SBT中首次使用后需要长10倍

时间:2013-03-14 17:19:40

标签: scala scala-2.10

我正在将一些代码从2.9.1更新到2.10.0(我尝试使用相同结果的2.10.1),在两种情况下都使用SBT 0.12.1。

当我在命令行上运行sbt clean compile时,它们都会在大约250秒后完成。

但是,当我以交互方式运行sbt并重复输入clean然后compile时,我的2.9编译速度会更快,但我的2.10编译速度慢10倍

如果我使用768m的堆大小,则在第3次编译时2.10内存不足。堆大小为4g,每次都可以编译,但在第一次迭代后总是慢10倍。

[success] Total time: 258 s, completed Mar 14, 2013 10:44:34 AM
[success] Total time: 2048 s, completed Mar 14, 2013 11:23:03 AM
[success] Total time: 2049 s, completed Mar 14, 2013 11:58:42 AM
[success] Total time: 2047 s, completed Mar 14, 2013 12:43:19 PM

我调试以找出正在发生的事情的最佳方式是什么?

2 个答案:

答案 0 :(得分:7)

谢谢你CodeCache link的反义词。我最初驳回了它,因为使用其建议的-XX:+UseCodeCacheFlushing选项没有做任何改进,但我只是尝试使用-XX:ReservedCodeCacheSize=2g并解决了这个问题。

有谁知道为什么-XX:+UseCodeCacheFlushing没有帮助,或者所有代码缓存java选项的一些推荐值?

为了好玩,以下是使用-XX:+HeapDumpOnOutOfMemoryError -server -XX:ReservedCodeCacheSize=2g -Xmx4g -Xss4M -XX:MaxPermSize=512M -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+CMSClassUnloadingEnabled -XX:+UseCodeCacheFlushing

生成的编译时间
2.10.1 (interactive, repeating clean/compile)
    194 s
    149 s
    95 s
    87 s
    84 s
2.9.1 (interactive, repeating clean/compile)
    187 s
    129 s
    83 s
    77 s
    74 s
2.10.1 (batch sbt clean compile)
    195 s
2.9.1 (batch sbt clean compile)
    177 s

答案 1 :(得分:0)

您可以首先附加一个探查器或监视器,以查看GC发生了什么。要初步了解JVisualVM等库存工具应该是什么就足够了。当然,如果你有YourKit,那也可以。

<强> Addenddum

作为一个有点有趣,但现在基本上无关紧要,我最近发现Scala 2.9.0-1在编译Specs2测试时非常缓慢(至少是不可变的)。切换到2.9.1产生了巨大的差异。当我不得不将一些单元测试添加到之前没有的项目时,我只注意到它,编译时间变得令人痛苦。在预感中,我切换到2.9.1,一切都恢复正常。