【问题标题】:java how can I measure method call times?java如何测量方法调用时间?
【发布时间】:2012-03-15 16:56:28
【问题描述】:

我有一个简单的课程,我想测量方法调用时间,我该怎么做?寻找实现这一目标的通用方法,以便我也可以将其应用于更困难的课程。谢谢

import java.io.*;
import java.util.*; 

public class Turtle {
  private String name;
  private Formatter f;
  public Turtle(String name, Formatter f) {
    this.name = name;
    this.f = f;
  }

  public void move(int x, int y) {
    f.format("%s The Turtle is at (%d,%d)\n", name, x, y);
  }

  public static void main(String[] args) {
    PrintStream outAlias = System.err;
    Turtle tommy = new Turtle("Tommy",
      new Formatter(System.out));
    Turtle terry = new Turtle("Terry",
      new Formatter(outAlias));
    tommy.move(0,0);
    terry.move(4,8);
    tommy.move(3,4);
    terry.move(2,5);
    tommy.move(3,3);
    terry.move(3,3);
  }
}

【问题讨论】:

  • 你是什么意思,“方法调用时间”?
  • 正如其中一位 ppl 所说,现在是 CPUT 时间。我想知道是否有任何 Java 内置方法。不是在寻找任何复杂的东西,比如探查器,而是我可以在我的代码中临时使用的东西。像这样:long startTime = System.currentTimeMillis(); tommy.move(0,0); long endTime = System.currentTimeMillis(); System.out.println("That takes " + (endTime - startTime) + " milliseconds");//但是有没有办法用一些Java方法在一行中做到这一点?
  • @aretal 您的示例测量的是经过(墙)时间,而不是 CPU 时间。显然很难在一行中做到这一点,因为您至少需要标记时钟应该以某种方式开始和停止的行。 Aspects 可以为您提供一个紧凑的解决方案,但如果您只想测量时间,那么深入研究 AOP 可能有点过头了。
  • 是的,我了解我的解决方案的局限性,这就是为什么希望有更好的解决方案。它似乎是AOP。还是谢谢你

标签: java methods time call


【解决方案1】:

使用分析器或手动计数:

public static int MOVE_CALL_COUNT;


public void move(int, int)
{
    MOVE_CALL_COUNT++;
}

建议进行分析。在 NetBeans 中有一个内置的分析器。否则,推荐使用 VisualVM,它与 NetBeans 中的分析器相同。

如果您真的想知道运行这些方法需要多长时间,请使用分析器。

【讨论】:

  • 我认为 aretai 是指用户或 CPU 时间的数量,因为帖子被标记为 [时间]。他还直接要求通用方法,因此手动计数也可能不是正确答案。当然,使用探查器可能的继续方式。
【解决方案2】:

试试 JDK 中的分析器,visualvm

【讨论】:

    【解决方案3】:

    如果要测试每个方法需要多长时间执行,那么在 SO 上已经有一些与此相关的好问题。查看this one for example

    我的偏好是使用 AOP,尤其是在具有许多方法的大型项目中,这样它就不会过多地更改现有代码。 This answer 关于我上面链接的问题,出于同样的原因,建议使用 AOP。正如他所建议的,深入了解 AOP 超出了本文的范围,但肯定值得一看。查看this tutorial 了解如何使用 spring 进行方法计时。

    【讨论】:

      【解决方案4】:

      使用专用工具来显示您的更多需求 :) 在我看来,VisualVM 是最好的工具,但是还有其他可用的工具(例如,JDK 原生提供的 JConsole,或付费的 JRockit)。
      阅读更多here on my post

      这些工具显示正在运行的应用程序和它们消耗的资源,以及 servlet(如果有)处理时间、错误和调用计数等。还列出了实例化的线程和类。这一定会满足您的需求

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        相关资源
        最近更新 更多