我对Java世界一无所知(我主要使用C / Python)但是Scala看起来很有趣,可以吸引我。我遇到的一个问题是巨大的启动开销 - 最少0.3秒,更多如果我使用解释器而不是编译,相比之下,对于Python或C实际上是0。因此,即使语言比Python快几十倍,如果我试图将它用于简单的任务,它仍然是在实践中要慢得多。
有没有办法减少这个时间,或者它是JVM中不可避免的一部分+ Scala程序所需(隐式)导入的数量?
答案 0 :(得分:15)
你在使用什么类型的电脑?显然存在JVM启动开销,但如果JVM检测到您正在server-class machine上运行,则会更大。
在J2SE平台版本5.0中,一类称为服务器级机器的机器被定义为具有以下内容的机器:
- 2个或更多物理处理器
- 2 GB或更多GB的物理内存
您可以使用-client
选项将JVM置于客户端模式中。调整客户端模式以缩短启动时间。
此外还有 modularize the JVM (项目 Jigsaw ),这将进一步缩短启动时间 - 这已经开始于{{ 1}}。
答案 1 :(得分:8)
请参阅Nailgun
答案 2 :(得分:8)
您可以通过打开Scala REPL然后使用:load
命令将脚本直接加载到JVM启动时来解决问题。这编译(它确实需要一些时间,但我在实践中找不到很长时间)脚本的内容并加载它以便在REPL中使用。例如:
scala> :load testScript.scala
Loading testScript.scala...
import scala.collection.mutable.Map
memory: scala.collection.mutable.Map[Int,Int] = Map()
fib: (Int)Int
res7: Int = 165580141
scala> fib(10)
res1: Int = 55
scala> fib(11)
res2: Int = 89
scala> fib(12)
res3: Int = 144
scala> fib(13)
res4: Int = 233
例如,我在Scala中编写不同原型时的典型工作流程如下。我在一个窗口中打开了一个文本编辑器,在另一个窗口中打开了Scala REPL。我编写代码然后加载它(:load script.scala
)。脚本生成的结果立即可用(如上面的脚本res7
所示),并且脚本中定义的任何函数,类或对象也可用。而且它比运行scala myScript.scala
更快,因为JVM已经加载。
如果你去编译路线,请使用fsc
(快速Scala编译器)。第一次调用它会创建一个编译代码的守护进程。因此,您只需支付一次JVM启动价格。请注意,如果您更改CLASSPATH
(环境变量)的值,则必须重新启动fsc
(这是一段时间让我烦恼的事情)。
-- Flaviu Cipcigan