Java 卡尺:为什么不使用注释来定义基准?
刚刚了解了Caliper,并浏览了文档——它看起来是一个很棒的工具(感谢Kevin和Google的一帮人对它的开源) 问题。为什么没有一种基于注释的机制来为常见用例定义基准?似乎是这样的:Java 卡尺:为什么不使用注释来定义基准?,java,microbenchmark,caliper,Java,Microbenchmark,Caliper,刚刚了解了Caliper,并浏览了文档——它看起来是一个很棒的工具(感谢Kevin和Google的一帮人对它的开源) 问题。为什么没有一种基于注释的机制来为常见用例定义基准?似乎是这样的: public class Foo { // Foo's actual code, followed by... @Benchmark static int timeFoobar(int reps) { Foo foo = new Foo(); for (int i = 0; i
public class Foo {
// Foo's actual code, followed by...
@Benchmark
static int timeFoobar(int reps) {
Foo foo = new Foo();
for (int i = 0; i < reps; ++i) foo.bar();
}
}
公共类Foo{
//Foo的实际代码,后跟。。。
@基准
静态int-timeboobar(int-reps){
Foo-Foo=新的Foo();
对于(int i=0;i
可以节省几行代码并提高可读性。一种可能的解释是,使用注释的基准不能在Java 1.5之前的JVM上运行。(考虑到Java1.5的历史,这不是一个很有说服力的理由。)
事实上这是难以置信的。最新的卡钳代码库定义了一个名为
@VmOption
的注释,因此它们的目标不是支持Java 1.5之前的平台。(我并不是建议他们应该……)我们决定使用timeFoo(int reps)
而不是@Time foo(int reps)
,原因如下:
- 我们仍然有很多JUnit3.8测试,并且与它的
方案保持一致testFoo()
- 无需
导入com.google.caliper.Time
- 最后,我们将把
Foo的基准名称报告为Foo。这很简单,只需time
。如果我们使用注释,我们最终将使用更复杂的机制来处理名称,如methodName.substring(4)
、@Time-timeFoo(int-reps)
和@Time-benchmarkFoo(int-reps)
@Time-foo(int-reps)
也就是说,我们正在重新考虑卡钳1.0的问题。您可能应该在他们的Jesse中问这个问题,谢谢您的详细回答。你的观点都有意义,但作为一个来自谷歌公司的C++侧的前Google,最近才移动了Java专职,我非常喜欢Sanjay的C++简单而有效的java微基准的API。在那里我经常使用它来编写数值和准数值代码。注释语法对我来说似乎是最“自然”的,因为它几乎完全与之平行。我们有一个谷歌内部的前身框架,它使用了@Benchmark注释,我们更改它的主要原因只是因为我讨厌它,并且发现命名约定更简单,更容易记住。但是,是的,它不太可能在某一点上改变。“time*”约定要好得多:它更简单,而且虽然可以忘记放置注释,但不能忘记正确命名方法。请坚持下去。