改善Scala脚本启动时间 - 客户端模式?

时间:2010-11-21 12:42:01

标签: performance scala jvm startup

我想让简短的Scala脚本像python脚本一样快地运行,特别是在脚本启动时间方面。

任何人都可以推荐一些方法,例如,不涉及使用GCJ进行编译吗?

我能想到的一种方法是使用JVM的客户端模式运行脚本,但我似乎无法使其工作。一个例子(已知 - 良好)shebang为此将是伟大的。

更新:我知道其他问题,但不要认为到目前为止找到了任何可行的答案,因为我正在寻找适用于STANDARD安装的解决方案,而无需额外的要求。这就是我试图解决的问题“例如,不涉及使用GCJ进行编译”。

似乎-client模式是为了这个明确的目的而设计的,但是出于某种原因从scala脚本激活是很尴尬的。

3 个答案:

答案 0 :(得分:6)

由于many other questions已经过去,如果只能知道如何查找它们,请使用Nailgun

提高脚本性能的其他方法是在系统启动时启动fsc,因此它可用于脚本,并使用-savecompiled,以避免重复编译脚本。

修改

你提到-client模式,但我认为这不是一个好的选择。这将为您提供一个较慢的Scala编译器,并且如果不是Java,几乎不会改善编译器本身的启动时间。将fsc作为守护程序,以-server运行,和/或使用-savecompiled保存已编译的脚本,效果会更好。

现在,我不知道您使用-client遇到了什么问题,但我已经读过它对64位JVM不起作用。可能是你的情况吗?

PS:查看similar个问题,我注意到JRuby内置了Nailgun支持!

答案 1 :(得分:0)

我还没有尝试过这个,但scala-native承诺近乎即时启动,因为它编译成本机二进制文件。因此,一种解决方案是将其作为一些二进制下载提供。

http://www.scala-native.org/en/latest/

答案 2 :(得分:0)

我只是试图通过这种方式通过Scala将'-client'参数传递给JVM:

#!/bin/sh
exec scala -J-client "$0" "$@"
!#
args.foreach(println)

似乎可行。 Daniel C. Sobral写道,他读到它不适用于64位JVM。我不知道,也许这已经过时了。无论如何,它似乎会稍微缩短启动时间。

运行:

:~$ time /tmp/testScalasScript arg1
arg1

real    0m2,170s
user    0m2,228s
sys     0m0,217s

这是仅几次测试中最快的运行。没有它,则需要花费0.5s的时间。但这确实是一个快速测试,应该更系统地完成,以得出有意义的结果。

是否没有办法使Scala进行编译并在脚本的第一次运行时保存编译结果,以便更快地重用?但是我目前还不确定。

更新: 我只是看到在'java -help'上没有记录选项'-client'(是吗?)。无论如何,不​​会引发任何错误(使用不存在的选项即可完成)。所以我不确定'-client'选项是否真的会带来后果。