如何减少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