我试着理解,控制运行次数的正确方法是:试用还是代表?令人困惑的是:我用--trial 1运行基准并收到输出:
0%场景{vm = java,trial = 0,benchmark = SendPublisher} 1002183670.00 ns; Ï= 315184.24 ns @ 3次试验
看起来有3次试验。那些试验是什么?什么是代表?我可以使用选项--debug&来控制rep值。 --debug-reps,但运行w / o debug时的值是多少?我需要知道我的测试方法被调用了多少次。
答案 0 :(得分:1)
在Caliper 0.5和1.0之间,一些术语发生了变化,但这应该可以解释两者。请记住,0.5中的内容有点模糊,因此1.0的大部分更改都是为了让事情更清晰,更精确。
Caliper的单次调用是运行。每次运行都有一些试验,这只是运行中所有工作的另一次迭代。在每个试验中,Caliper执行一些场景。方案是VM,基准测试等的组合。方案的运行时通过计算执行一些 reps 来计量,这是在运行时传递给基准方法的数字。当然,多个代表是必要的,因为在微基准测试中单个调用无法获得精确的测量结果。
Caliper 1.0遵循一个非常相似的模型。单个Caliper调用仍然是运行。每次运行都包含一些试验,但试验更准确地定义为使用仪器测量的场景的调用。
场景大致定义为您正在测量的内容(主机,VM,基准,参数),仪器是执行测量的代码及其配置方式。我们的想法是,如果完全可重复的基准是f(x)=y
形式的函数,则Caliper将被定义为instrument(scenario)=measurements
。
在运行时工具的执行中(对其他工具来说类似),仍然存在相同的reps概念,即传递给基准代码的迭代次数。您无法直接控制rep值,因为每个仪器都会执行自己的计算以确定它应该是什么。
在运行时,Caliper通过计算一些实验计划其执行,实验是仪器,基准,VM和参数的组合。每个实验运行--trials
次,并报告为具有自己ID的单个试验。
reps
参数传统上,使用reps参数的最佳方法是在基准代码中包含一个看起来或多或少的循环:
for (int i = 0; i < reps; i++) {…}
这是确保代表 与报告的运行时间线性扩展 的最直接方式。这是必要的属性,因为Caliper试图根据许多人的总成本来推断单一,统一操作的成本。如果运行时与reps数不成线性关系,则结果将无效。这也意味着代表不应直接传递给基准代码。
答案 1 :(得分:0)
我需要对套接字进行基准测试并控制确切的发送/接收数量等等。
我用“not canonic”方式编写了time方法,我只是忽略了rep参数:
void timeSendPublisher(int rep) {
publisher.run(submsgs);
}
这允许我控制向订户发送多少消息(submsgs参数)。
当消息数量足够大时,我收到了来自TimeMeasure的warmUp的RunTimeException。我评论了代码,它只检查测量持续时间以查看结果,然后收到:
0%场景{vm = java,trial = 0,benchmark = SendPublisher,submsgs = 50,subs = 2} 25102202788.00 ns; Ï= 460644.94 ns @ 3次试验
50%场景{vm = java,trial = 0,benchmark = SendPublisher,submsgs = 100,subs = 2} 50202435382.00 ns; Ï= 1709344.33 ns @ 3次试验
submsgs s linear runtime
50 25.1 ===============
100 50.2 ==============================
vm:java
审判:0
基准:SendPublisher
潜艇:2
我是否可以将报告中的时间解释为25.1秒用于发送50条消息和50.2条消息? 问题是,如果我仍然可以使用卡尺框架或我的情况离“微观基准”太远了吗?