我被要求使用Google的Caliper项目来创建一些微基准测试。我非常想使用最新测试版快照的注释功能,但除了一些小例子之外,我无法找到关于如何实际运行该事物的良好文档......有一个视频教程可以指导用户新的maven集成功能,我也被要求不使用。
现在我只是从他们中的一个剥离了一个小例子,并从另一个SO问题中收集了一些其他信息进行了修改:
public class Benchmarks {
public class Test {
@Param int size; // set automatically by framework
private int[] array; // set by us, in setUp()
@BeforeExperiment void setUp() {
// @Param values are guaranteed to have been injected by now
array = new int[size];
}
@Benchmark int timeArrayIteration(int reps) {
int dummy = 0;
for (int i = 0; i < reps; i++) {
for (int doNotIgnoreMe : array) {
dummy += doNotIgnoreMe;
}
}
return dummy;
}
}
//(Questionable practice here?)
public static void main (String args[]) {
CaliperMain.main(Test.class, args);
}
}
运行它给我的消息是我没有为size设置默认值。我无法追踪我应该放在哪里。
删除&#34;尺寸&#34;完全通过注释掉@Param线并给setUp中的数组声明赋予一个硬值,只是导致它决定是否存在&#34;没有实验要做,&#34;我认为这是有道理的。
如果有任何最新的资源或教程可以指出我做错了什么(可能很多,老实说),我会非常感激。
编辑:
我根据一些建议更新了这个:
public class Benchmarks {
@Param({"1", "10", "1000"}) int size; // set automatically by framework
private int[] array; // set by us, in setUp()
@BeforeExperiment void setUp() {
// @Param values are guaranteed to have been injected by now
array = new int[size];
}
@Benchmark int timeArrayIteration(int reps) {
int dummy = 0;
for (int i = 0; i < reps; i++) {
for (int doNotIgnoreMe : array) {
dummy += doNotIgnoreMe;
}
}
return dummy;
}
}
我正在浏览测试版快照并传入Benchmarks类作为参数。我收到以下内容:
Experiment selection:
Instruments: []
User parameters: {size=[1, 10, 1000]}
Virtual machines: [default]
Selection type: Full cartesian product
There were no experiments to be performed for the class Benchmarks using the instruments [allocation, runtime]
它似乎没有检测到任何仪器。我没有传递任何内容,因为它在文档中提到它只是使用默认分配,运行时(这对我来说很好)。
DOUBLE EDIT:发现那个问题,愚蠢的错误。一旦我确认,我会做快速的写作。
答案 0 :(得分:0)
运行它会给我一条消息,我没有为size设置默认值。
这非常简单:
@Param({"1", "10", "1000"}) int size;
删除&#34;尺寸&#34;完全通过注释掉@Param线并给setUp中的数组声明赋予一个硬值,只是导致它决定是否存在&#34;没有实验要做,&#34;这是有道理的,我想。
不,它没有。没有任何参数,每个基准测试方法只运行一次。 请参阅解决方案的其他答案。
例如@Param
上有一些Javadoc。实际上,并没有改变。注释已经取代了约定(现在你不需要time
前缀),params保持不变,setup使用注释而不是继承。
答案 1 :(得分:0)
运行它会给我一条消息,我没有为size设置默认值。
参数可以通过默认值设置:
@Param({"1", "10", "1000"}) int size;
或者通过-D
标志传递值。例如:-Dsize=1,10,1000
。枚举和布尔值得到特殊处理,因为它使用所有可能的值而无需在注释中列出它们。
通过注释@Param线并给setUp中的数组声明赋予硬值来完全删除“size”只会导致它决定“没有实验要做”,这是有道理的,我想。 / p>
问题可能是您的基准测试是一个内部类,需要对封闭类的引用(尽管这应该是一个错误)。要么使您的基准测试类成为顶级类(推荐),要么使其成为静态类。
此外,没有特别需要包括主要方法。使用基准类作为第一个参数调用CaliperMain
是等效的。