通过命令行执行时实现SBT运行启动速度

时间:2014-08-22 02:12:25

标签: scala sbt

我一直在使用Scala中的一小组命令行程序。而 开发我使用了SBT,并在控制台内运行测试程序。在 这一点程序有一个快速的启动时间(在初始编译后重新运行);几乎是即时的,甚至 附加依赖。

现在我试图在sbt之外的系统上实际使用它们,速度有明显的滞后。我正在寻找方法 减少这一点,因为这些实用程序的性质几乎没有延迟。

到目前为止,我所取得的最佳速度是利用Drip。我使用Pack将所有依赖项包含在lib目录中,然后通过执行这样的shell脚本来运行:

#!/bin/sh

SCRIPT=$(readlink -f "$0")
SCRIPT_PATH=$(dirname "$SCRIPT")
PROG_HOME=`cd "$SCRIPT_PATH/../" && pwd`


CLASSPATH_SUFFIX=""
# Path separator used in EXTRA_CLASSPATH
PSEP=":"
exec drip \
     -cp "${PROG_HOME}/lib/*${CLASSPATH_SUFFIX}" \ # Add lib directory to classpath
     TagWorkspace "$@"  # TagWorkspace is the main class

在从SBT内部调用运行之后,这仍然明显变慢。 我很好奇为什么SBT能够以更快的速度启动应用程序,并且如果有一些方法让我采用它的策略,或SBT本身,即使这意味着保持一个长期的生活过程来实际运行命令通过。

2 个答案:

答案 0 :(得分:1)

除非您为运行任务打开了分叉,否则这可能是由于VM启动时间造成的。当您从活动的SBT会话内部运行时,您已经初始化了一个指向您的类的VM - 所有SBT需要做的是创建一个新的ClassLoader并将其指向您的构建输出目录。这会绕过启动新VM时发生的所有其他(非无关紧要的)事件。

您是否尝试过使用客户端VM从命令行启动实用程序?遗憾的是,这不是64位Java的选项,因为Oracle显然不想支持它,但如果您使用的是32位虚拟机,请尝试添加-client参数从命令行为VM提供的列表。

如果您使用的是64位虚拟机,一些谷歌搜索会发现一些非正式的OpenJDK分支,它们重新启用了客户端虚拟机。它实际上只是JVM构建中的一个#define - 它一旦被编译就可以正常工作。

答案 1 :(得分:0)

我唯一的缓慢就是推出SBT。在7381 bogomips CPU上运行带java(无滴漏)版本1.8的hello-word Scala应用只需0.2秒。

如果你没有那么大,我怀疑你的应用程序启动需要加载数千个类,并创建它们的实例。

相关问题