【问题标题】:Achieve SBT Run startup speed while executing through command line通过命令行执行时实现 SBT Run 启动速度
【发布时间】:2014-10-15 19:29:20
【问题描述】:

我一直在用 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 中调用 run 慢。 我很好奇为什么 SBT 能够以如此之快的速度启动应用程序,以及我是否有办法利用它的策略或 SBT 本身,即使这意味着要保持一个长期的生存过程来实际运行命令.

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

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

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

    如果您使用的是 64 位 VM,通过谷歌搜索会发现一些 OpenJDK 的非官方分支已重新启用客户端 VM。它实际上只是 JVM 构建本身中的一个 #define - 一旦它被编译进去就可以正常工作。

    【讨论】:

      【解决方案2】:

      我唯一的缓慢是启动 SBT。在 7381 bogomips CPU 上运行带有 java(无 Drip)版本 1.8 的 hello-word Scala 应用程序仅需 0.2 秒。

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

      【讨论】:

        猜你喜欢
        • 2016-06-10
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多