在 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)=y
Caliper 将被定义为instrument(scenario)=measurements
。
在运行时工具的执行中(其他工具类似),仍然有相同的 reps 概念,即传递给基准代码的迭代次数。您无法直接控制 rep 值,因为每个工具都会执行自己的计算以确定它应该是什么。
在运行时,Caliper 通过计算一些实验来计划其执行,这些实验是仪器、基准、VM 和参数的组合。每个实验都会运行--trials
多次,并作为具有自己 ID 的单独试验报告。
如何使用reps
参数
传统上,使用 reps 参数的最佳方法是在基准代码中包含一个循环,看起来或多或少类似于:
for (int i = 0; i < reps; i++) {…}
这是确保代表次数与报告的运行时间呈线性关系的最直接方法。这是一个必要的属性,因为 Caliper 试图根据多个操作的总成本来推断单个统一操作的成本。如果运行时间与代表次数不成线性关系,则结果将无效。这也意味着代表不应直接传递给基准代码。