Java 卡尺:为什么不使用注释来定义基准?

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

刚刚了解了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 < 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
  • 最后,我们将把
    time
    Foo的基准名称报告为Foo。这很简单,只需
    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*”约定要好得多:它更简单,而且虽然可以忘记放置注释,但不能忘记正确命名方法。请坚持下去。