为什么调用外部scala编译器比使用运行时解释器库更快?
为什么调用外部
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或字符串中给出的类似代码(它是一个脚本解释器,即它在我的应用程序执行期间只运行一次). 作为最后一个资源,Java Scripting Engines与反射或字节码编译的Java代码相比有多快?我发现,至少,他们可以编译:Compiling oft-used scripts. 选择解决方案: 解决方法
有许多事情未说明(如内存设置),但你要比较苹果和橘子.
命令行脚本运行器不是REPL会话;相反,它使用main方法将代码包装在一个简单的对象中,编译并运行它. 相比之下,REPL中的每个解释行(或可编译的东西)都包含在一个对象中(导入了会话历史记录,因此您可以参考过去的结果). 即使是模数REPL启动,这也会产生性能影响,见this issue. 脚本运行器的简单包装逻辑内置于解析器中. Here is how脚本运行器运行编译.或者,它看起来像this is how -e is handled. 编辑:您对您的问题的评论意味着您真的想要fsc编译服务器行为.启动fsc并使用the compile client. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |