【问题标题】:Using simple-build-tool for benchmarks使用 simple-build-tool 进行基准测试
【发布时间】:2011-04-27 11:17:03
【问题描述】:

我正在尝试让 sbt 编译和构建一些基准。我已经告诉它将基准添加到测试路径中,以便它们与测试一起重新编译,但我不知道如何编写一个动作来让我实际运行它们。是否可以从 Project 定义类中调用类,甚至仅从命令行调用类?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    是的。

    如果您想在运行 SBT 的同一 VM 中运行它们,请在项目定义文件中编写类似于以下内容的自定义任务:

      lazy val benchmark = task {
        // code to run benchmarks
        None // Some("will return an error message")
      }
    

    在 SBT 控制台中输入 benchmark 将运行上述任务。要实际运行基准测试,或者就此而言,您已编译的任何其他类,您可以重用 SBT 的一些现有基础结构,即方法runTask,它将创建一个为您运行某些东西的任务。它具有以下签名:

     def runTask(mainClass: => Option[String], classpath: PathFinder, options: String*): Task
    

    只需将以下内容添加到您的文件中:

      lazy val benchmark = task { args =>
        runTask(Some("whatever.your.mainclass.is"), testClasspath, args)
      }
    

    运行基准测试时,有时建议您在单独的 jvm 调用中运行它们,以获得更可靠的结果。 SBT 允许您通过在字符串命令上调用方法! 来运行单独的进程。假设您有一个要运行的命令java -jar path-to-artifact.jar。那么:

    "java -jar path-to-artifact.jar" !
    

    在 SBT 中运行命令。你想把上面的 sn-p 放在一个单独的任务中,和之前一样。

    当您更改项目定义时,不要忘记reload

    【讨论】:

    • 我将支持在另一个 jvm 中运行基准测试的建议。当我从 sbt 调用测试时,它最终会耗尽内存(尤其是在许多测试失败的情况下)。这对测试来说很烦人(但不是致命的),但会扭曲基准。
    • 我在 Liftweb 和 sbt 中经常看到这种情况。我对此不是 100% 确定的,但由于以下原因,sbt 可能会失败。每次 sbt 重新编译您的文件并且您希望从 sbt 使用它们时,sbt 将使用自定义类加载器动态加载类文件。然后这些占用 jvm 中的 permgen 空间。重新编译后,旧类和新类都保留在 permgen 空间中,如果不收集旧类,迟早会用完它。增加运行 sbt 的 jvm 的 permgen 空间可能会有所帮助:`-XX:MaxPermSize=256m`。
    【解决方案2】:

    您不能简单地将基准编写为测试,以便在您在 SBT 中调用“测试”时运行它们吗?

    您还可以使用 'test-only' 运行特定测试,或使用 'run' 或 'exec' 运行主测试(有关详细信息,请参阅 http://code.google.com/p/simple-build-tool/wiki/RunningSbt)。

    【讨论】:

    • 它们可能需要很长时间,所以我想要一个单独的操作来运行它们。
    • @Dial 我明白了,为答案添加了一些替代方案。
    猜你喜欢
    • 2011-02-11
    • 2011-05-08
    • 2011-02-22
    • 2011-02-22
    • 2018-09-12
    • 1970-01-01
    • 2012-01-23
    • 2012-11-11
    • 2014-02-15
    相关资源
    最近更新 更多