【发布时间】:2013-06-30 04:09:48
【问题描述】:
为什么调用外部 scala 编译器比使用运行时解释器库更快? 在下面的代码中,需要将近 2 秒来预热解释器。
val out = new PrintStream(new FileOutputStream("/dev/null"))
val flusher = new java.io.PrintWriter(out)
val interpret = {
val settings = new scala.tools.nsc.GenericRunnerSettings(println _)
settings.usejavacp.value = true
new scala.tools.nsc.interpreter.IMain(settings, flusher)
}
interpret.interpret(" ") // <-- warming up
interpret.interpret(" Hello World ")
另一方面,当像在 shell 会话中一样从命令行运行 Scala 编译器时:
scala HelloWorld.scala
打印一个 Hello World 需要 不到 0.5 秒。
我正在尝试在运行时解析+执行字符串中给出的一些 Java、Scala 或类似代码(它是一个脚本解释器,即它只会在我的应用程序执行期间运行一次)。 Scala 代码显然会更好,但前提是它可以与 Java 选项一样快。 有没有比 nsc.interpreter 和外部编译器更快的替代方法在运行时从字符串执行代码? 我能找到的最好的是 Janino。它比 Scala 编译器更快,并且不需要 JDK(一个非常有趣的特性)。
作为最后一个资源,Java Scripting Engines 与反射或字节码编译的 Java 代码相比有多快?我发现,至少,它们可以编译:Compiling oft-used scripts。
选择的解决方案: runtimecompilescala.
【问题讨论】:
-
您不能在程序的早期异步运行预热代码吗?
-
“从命令行”是什么意思?来自 REPL?很明显为什么它更快:所有需要的类都已加载。
-
@ 0__ :好主意,但我做不到。它是小脚本的解释器。整体启动越快越好。
-
@sschaef:没有 REPL,只有解释器/编译器(或其他名称,我不太清楚)。问题已编辑。
-
也许它与你的类路径中有多少东西有关......
标签: scala reflection runtime interpreter