【问题标题】:How to reduce Scala (/ Java) startup overhead?如何减少 Scala (/Java) 的启动开销?
【发布时间】:2010-11-21 21:51:33
【问题描述】:

我对 Java 世界一无所知(我主要从事 C / Python),但 Scala 看起来很有趣,足以吸引我。我遇到的一个问题是巨大的启动开销 - 最少 0.3 秒,甚至更多如果我使用解释器而不是编译,则与 Python 或 C 的有效 0 相比。因此,即使该语言在运行后比 Python 快数十倍,但如果我尝试将其用于简单任务,它仍然是在实践中相当慢。

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

【问题讨论】:

标签: java performance scala optimization


【解决方案1】:

Nailgun

【讨论】:

    【解决方案2】:

    您在哪种计算机上使用它?显然存在 JVM 启动开销,但如果 JVM 检测到您在 server-class machine 上运行,这会更大。

    在 J2SE 平台版本 5.0 中,被称为服务器级机器的一类机器被定义为具有以下功能的机器:

    • 2 个或更多物理处理器
    • 2 或更多 GB 物理内存

    您可以使用-client 选项将JVM 置于客户端模式客户端模式已针对快速启动时间进行了调整。

    还有迁移到 modularize the JVM(项目 Jigsaw),这将进一步缩短启动时间 - 这从 JDK 1.6.0_10 开始。

    【讨论】:

    • 谢谢。 -client 有很大帮助,使我的“回声”测试程序平均从 0.3 秒缩短到 0.12 秒。在大多数情况下,这足以让人感觉反应灵敏。太糟糕了,大多数“客户端”现在都足够厚,可以满足服务器要求。
    【解决方案3】:

    您可以通过打开 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 也无法将编译时间缩短到正常(即工具友好)的启动时间。目标是在我编译后减少启动时间,这仍然很长。
    猜你喜欢
    • 2014-04-10
    • 2014-03-05
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2011-12-09
    • 2011-12-29
    相关资源
    最近更新 更多