2

我试图理解,控制运行次数的正确方法是什么:是试验还是代表?令人困惑:我使用 --trial 1 运行基准测试并收到输出:

0% 场景{vm=java, trial=0, benchmark=SendPublisher} 1002183670.00 ns; Ï=315184.24 ns @ 3 次试验

看起来进行了 3 次试验。那是什么试炼?什么是代表?我可以使用选项--debug 和--debug-reps 来控制rep 值,但是运行w/o debug 时的值是多少?我需要知道我的测试方法被调用了多少次。

4

1 回答 1

1

在 Caliper 0.5 和 1.0 之间,一些术语发生了变化,但这应该对两者都进行解释。请记住,0.5 中的情况有些模糊,因此对 1.0 所做的大部分更改都是为了使事情更清晰、更精确。

卡尺 0.5

Caliper 的单次调用是一次run。每次运行都有一些试验次数,这只是运行中执行的所有工作的另一次迭代。在每次试验中,Caliper 都会执行一些场景。场景是 VM、基准测试等的组合。场景的运行时间是通过计时执行一定数量的reps来衡量的,这是在运行时传递给您的基准测试方法的数量。当然,多次重复是必要的,因为在微基准测试中不可能获得单个调用的精确测量值。

卡尺 1.0

Caliper 1.0 遵循非常相似的模型。Caliper 的单次调用仍然是一次运行。每次运行都包含一定数量的试验,但试验更精确地定义为对使用仪器测量的场景的调用。

场景大致定义为您正在测量的内容(主机、VM、基准测试、参数),而仪器是执行测量的代码及其配置方式。这个想法是,如果一个完全可重复的基准是表单的函数,那么f(x)=yCaliper 将被定义为instrument(scenario)=measurements

在运行时工具的执行中(其他工具类似),仍然有相同的 reps 概念,即传递给基准代码的迭代次数。您无法直接控制 rep 值,因为每个工具都会执行自己的计算以确定它应该是什么。

在运行时,Caliper 通过计算一些实验来计划其执行,这些实验是仪器、基准、VM 和参数的组合。每个实验都会运行--trials多次,并作为具有自己 ID 的单独试验报告。

如何使用reps参数

传统上,使用 reps 参数的最佳方法是在基准代码中包含一个循环,看起来或多或少类似于:

for (int i = 0; i < reps; i++) {…}

这是确保代表次数与报告的运行时间呈线性关系的最直接方法。这是一个必要的属性,因为 Caliper 试图根据多个操作的总成本来推断单个统一操作的成本。如果运行时间与代表次数不成线性关系,则结果将无效。这也意味着代表不应直接传递给基准代码。

于 2013-02-04T19:03:55.540 回答