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

如何减少Scala(/Java)启动开销?,java,performance,scala,optimization,Java,Performance,Scala,Optimization,我对Java世界相当无知(我主要使用C/Python),但Scala看起来很有趣,吸引了我。我遇到的一个问题是巨大的启动开销-最小0.3秒,如果我使用解释器而不是编译,则比Python或C的有效启动时间要长得多。因此,即使该语言在运行后比Python快几十倍,如果我试着用它来完成简单的任务,它在实践中仍然相当慢 有没有办法减少这一时间,或者这是JVM中不可避免的一部分+Scala程序所需(隐式)导入的数量?请参见您在哪种计算机上使用它?显然,存在JVM启动开销,但如果JVM检测到您正在一个虚拟机

我对Java世界相当无知(我主要使用C/Python),但Scala看起来很有趣,吸引了我。我遇到的一个问题是巨大的启动开销-最小0.3秒,如果我使用解释器而不是编译,则比Python或C的有效启动时间要长得多。因此,即使该语言在运行后比Python快几十倍,如果我试着用它来完成简单的任务,它在实践中仍然相当慢


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

请参见您在哪种计算机上使用它?显然,存在JVM启动开销,但如果JVM检测到您正在一个虚拟机上运行,则这一开销会更大

在J2SE平台5.0版中,称为服务器级机器的机器类别被定义为具有以下特性的机器:

  • 2个或更多物理处理器
  • 2 GB或更多物理内存
您可以使用
-client
选项将JVM置于客户机模式。客户机模式为快速启动时间进行了调整


还有一个迁移到(项目),这将进一步提高启动时间-这是从
JDK 1.6.0_10

开始的,您可以通过打开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

即使使用fsc,也无法将编译降低到合理(即工具友好)的启动时间。我的目标是在编译完成后减少启动时间,因为启动时间仍然很长。谢谢-客户端的帮助很大,使我的“echo”测试程序平均从0.3秒提高到0.12秒。这足够低,在大多数情况下都能感觉到反应。遗憾的是,现在大多数“客户机”的厚度都足以满足服务器的要求。另请参阅