java - 使用 @Timed 注释对方法进行计时 - 与输入大小相关

标签 java spring-boot graphite micrometer

使用@Timed注释,我们可以计算方法运行所需的时间:

@Timed 
public void loopInput(int counter){
    for (int i = 0; i < counter; i++){
        i++;
    }
}

但是,假设我们的方法有一些输入,其大小可以显着改变运行该方法所需的时间(如上面的示例所示)。

如果没有一些有关输入大小的额外潜在信息,@Timed 给出的时间测量是否毫无意义?

如果输出大小不同,它也将毫无意义:

    @Timed
    public void printStudentCourses(int studentId){
       //get student from DB
       // ...
       for (Course cource: Student.getCourses()) {
          System.out.println(cource);
       }
    }

当然,打印类(class)列表较多的学生会需要更长的时间。

所以:

  1. 我们可以从 @Timed 测量中获得哪些真正的见解?
  2. 有没有办法为 @Timed 测量添加一些附加信息?

最佳答案

@Timed 是添加计时器的简单方法。这对于了解一个方法花费的时间很有用,并让您质疑为什么它花费的时间比预期的要长。仅这些数据就会告诉您可能存在异常值,并且需要单独测量这些异常值。

为了获得单独的见解,添加有助于区分不同计时器的标签可能是值得的。

在这里,我根据迭代的数量添加一个标签(桶可能是 1、2-5、>5)

public void printStudentCourses(int studentId){
   //get student from DB
   // ...
   Metrics.timer("my.timer", Tags.of("bucket", chooseBucket(student.getCourses().size()))).record(() -> {
     for (Course course: student.getCourses()) { 
        //Assuming there is something more expensive worth measuring here
        System.out.println(course);
     }
   })
}

关于java - 使用 @Timed 注释对方法进行计时 - 与输入大小相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086960/

相关文章:

javascript - 使用 Java,如何验证/验证 Google Analytics 异步跟踪代码(分析片段)位于网页源的 <head> 标记部分下

javascript - Vue js,缺少从 HTML 到相关 JS 的映射

java - Struts 1 - 通过一篇文章调用更多操作,无需更改 struts-config

java - 如何在 `gradle.build`中强制使用版本的特定jar?

spring-boot - Keycloak表示403禁止使用GET以外的HTTP方法

java - Spring Batch WriterNotOpenException

graphite - 在 ubuntu 14.04 上 pip install Graphite 出现错误

spring-boot - Spring Boot - Rest Controller 响应两个 JSON 对象

python - 无法使用 pip 安装碳?

python - 如何修复 Graphite 中的守护进程导入错误?