我想让简短的Scala脚本像python脚本一样快地运行,特别是在脚本启动时间方面。
任何人都可以推荐一些方法,例如,不涉及使用GCJ进行编译吗?
我能想到的一种方法是使用JVM的客户端模式运行脚本,但我似乎无法使其工作。一个例子(已知 - 良好)shebang为此将是伟大的。
更新:我知道其他问题,但不要认为到目前为止找到了任何可行的答案,因为我正在寻找适用于STANDARD安装的解决方案,而无需额外的要求。这就是我试图解决的问题“例如,不涉及使用GCJ进行编译”。
似乎-client模式是为了这个明确的目的而设计的,但是出于某种原因从scala脚本激活是很尴尬的。
答案 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承诺近乎即时启动,因为它编译成本机二进制文件。因此,一种解决方案是将其作为一些二进制下载提供。
答案 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'选项是否真的会带来后果。