如何减少Scala(/ Java)启动开销?

时间:2009-08-22 14:10:41

标签: java performance scala optimization

我对Java世界一无所知(我主要使用C / Python)但是Scala看起来很有趣,可以吸引我。我遇到的一个问题是巨大的启动开销 - 最少0.3秒,更多如果我使用解释器而不是编译,相比之下,对于Python或C实际上是0。因此,即使语言比Python快几十倍,如果我试图将它用于简单的任务,它仍然是在实践中要慢得多。

有没有办法减少这个时间,或者它是JVM中不可避免的一部分+ Scala程序所需(隐式)导入的数量?

3 个答案:

答案 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