如何减少Scala(/ Java)启动开销?
我对Java世界一无所知(我主要做的是C / Python)但是Scala看起来很有趣,可以吸引我。我遇到的一个问题是巨大的启动开销 – 最小0.3秒,如果我更多m使用解释器而不是编译,相比之下,Python或C实际上是0。所以即使语言比Python快几十倍,如果我试图将它用于简单的任务,它仍然会相当慢实践。
有没有办法减少这个时间,或者它是JVM中不可避免的一部分+ Scala程序所需(隐式)导入的数量?
你在用什么类型的电脑? 显然存在JVM启动开销,但如果JVM检测到您正在服务器级机器上运行,则会更大。
在J2SE平台版本5.0中,一类称为服务器级机器的机器已被定义为具有以下内容的机器:
- 2个或更多物理处理器
- 2个或更多GB的物理内存
您可以使用-client
选项将JVM置于客户端模式 。 调整客户端模式以实现快速启动时间。
还有一个模块化JVM (项目Jigsaw )的举措,它将进一步改善启动时间 – 这已经从JDK 1.6.0_10
开始了。
见Nailgun
您可以通过打开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