2017-04-06 147 views
1

我从命令行运行Netlogo时有点生疏,从未使用过基准测试功能。看起来很有希望。 =)Netlogo基准测试

我完全是在开始,因为它似乎NetLogo 6.0可能有点不同于5. *。

我试图让基准套件运行:https://github.com/NetLogo/NetLogo/wiki/Benchmarking

现在,我下载了一些文件从http://ccl.northwestern.edu/netlogo/models/models/test/benchmarks/

,并在我的NetLogo 6.0目录中创建2个目录

NetLogo 6.0 /型号/测试

and

的NetLogo 6.0 /模型/基准

,并把从http://ccl.northwestern.edu/netlogo/models/models/test/benchmarks/文件放到我的基准目录。

在网站上,它说运行./sbt,然后run-main org.nlogo.headless.HeadlessBenchmarker Bureaucrats但是,我是n00bish,没有命令./sbt setup。我看到这是一个普通的扩展安装程序命令在线,但不知道该怎么办...对不起。所以我现在的问题是,接下来我要做些什么才能让它启动并运行?

从文档方面来看,我认为可能需要清理一下,/models/test/benchmarks/中应该有一个文件,名为"Bureaucrats Benchmark.nlogo"我没有意识到驱动程序将" Benchmark.nlogo"添加到提供的名称中。如果文件被称为"<name> Benchmark.nlogo"

我没有得到它但它可能是说提供<name>到org.nlogo.headless.HeadlessBenchmarker有用的,但有什么办法让我们打电话给所有的基准测试在基准目录中?文档中提到了它,但我没有看到任何命令。

让我知道你的想法和任何帮助表示赞赏!

编辑:从git下载repo后,正如Bryan建议的那样,我运行了./sbt并得到了以下错误。

[错误](运行主-0)抛出java.lang.ClassNotFoundException: org.nlogo.headless.HeadlessBenchmarker 抛出java.lang.ClassNotFoundException: org.nlogo.headless.HeadlessBenchmarker在 java.lang中.ClassLoader.findClass(ClassLoader.java:530) java.lang.ClassLoader.loadClass(ClassLoader.java:424)[trace] Stack trace suppress:运行最后一个root/compile:runMain获取完整输出。 java.lang.RuntimeException:非零退出代码:1 at scala.sys.package $ .error(package.scala:27)[trace]堆栈跟踪 已抑制:运行最后一个根/编译:runMain输出全部内容。[错误] (根/编译:runMain)非零的退出代码:1 [错误]总时间:2秒, 完成2017年4月10日下午2时16分21秒

回答

2

./sbt被包括在存储库中的NetLogo 。这是this文件。如果需要,运行它将自行安装sbt(和scala)。确保您在运行时位于NetLogo存储库的根目录中。

编辑:

等待,澄清,你想基准自己的模型或自身的NetLogo?

如果NetLogo本身(这是什么https://github.com/NetLogo/NetLogo/wiki/Benchmarking在谈论什么),你需要从github:https://github.com/NetLogo/NetLogo签出NetLogo存储库。你可能想要这样做的唯一原因是如果你打算为核心NetLogo代码做贡献或者正在开发一个扩展或其他东西。

只需对自己的模型进行基准测试,您就不想做任何这样的事情。通常情况下,最好在NetLogo程序中进行基准测试,而不要在命令行进行基准测试。标杆的最简单的方法是做这样的事情:

setup reset-timer repeat 1000 [ go ] print timer 

它会告诉你需要多长时间你的模型做1000只蜱。所以,运行几次,修改你的模型,然后再运行几次,这会让你了解你的改变如何影响性能。

有关更多深入的基准测试和性能分析,请使用profiler扩展。这会打破你的程序,告诉你每个程序需要多长时间等等。

+1

我正在计划基准化一些基本原理,与Netlogo方面的一些替代实现进行比较。例如,半径内拉出一个正方形并通过它进行过滤。现在有更多的算法可以计算pi * r^2和Netlogo的4r^2结果。我认为通过使用您提供的代码(设置一个计时器)可能不足以满足JVM的要求 - 通常,您将有一个预热阶段并丢弃最初的几个结果。我不应该这样做吗?如果是这样,我不想小心我如何设计基准来测试性能。思考? – mattsap

+0

我确实想看看低级别的实现和一些高级概念。我给出了半径范围内的示例,但我也将使用A *与IDA *进行比较,以便在网格中搜索一些示例。 – mattsap

+0

在我看来,使用基准框架是一个好主意,因为你陈述的原因。正确的基准测试是很难的,我们的基准测试代码比'timer'更好。可悲的是,我们的基准框架早于JMH的存在;理想情况下,它将被重写为基于JMH的。 –

2

我用当前正确的命令更新了wiki页面。 (我改变run-mainheadless/runMain

有没有什么办法让我们打电话给在基准目录中的所有基准?

我认为这样做,如果你不通过基准名称......?值得一试。 (如果你想出来,请更新维基页面。)

+0

我接受了@ bryan的回答,因为他指向了./sbt。我授予你奖金,因为你提供了命令来让基准工作。我会玩弄事情并在需要的地方更新。谢谢! – mattsap

+0

还有一件事,你能解释为什么结果: “[info] 1/2(mean = 4.156,stddev = 0.000) [info] 4/340(mean = 4.040,stddev = 0.096)”。在每一行中,这是所有运行的累积平均值和标准差,而不仅仅是最近10秒? – mattsap

+0

是的,积累。该逻辑位于https://github.com/NetLogo/NetLogo/blob/hexy/netlogo-headless/src/main/workspace/Benchmarker.scala。 “当我们98%的人相信我们在事实真相的0.3%之内时,停下来” –