加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么调用外部scala编译器比使用运行时解释器库更快?

发布时间:2020-12-16 18:30:16 所属栏目:安全 来源:网络整理
导读:为什么调用外部 scala编译器比使用运行时解释器库更快? 在下面的代码中,需要将近2秒才能使解释器变热. val out = new PrintStream(new FileOutputStream("/dev/null"))val flusher = new java.io.PrintWriter(out)val interpret = { val settings = new sca
为什么调用外部 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 ")

另一方面,当从命令行运行Scala编译器时,就像在shell会话中一样:

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会话;相反,它使用main方法将代码包装在一个简单的对象中,编译并运行它.

相比之下,REPL中的每个解释行(或可编译的东西)都包含在一个对象中(导入了会话历史记录,因此您可以参考过去的结果).

即使是模数REPL启动,这也会产生性能影响,见this issue.

脚本运行器的简单包装逻辑内置于解析器中. Here is how脚本运行器运行编译.或者,它看起来像this is how -e is handled.

编辑:您对您的问题的评论意味着您真的想要fsc编译服务器行为.启动fsc并使用the compile client.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读