10

我想测试某些代码块的运行时间如下:

start = System.currentTimeMillis();
{
   ...
   this.dosomething();
}
end = System.currentTimeMillis();
System.out.println(end - start);

当我优化代码块时,如何注释那些快速计算时间的代码,如下所示?

//start = System.currentTimeMillis();
{
   ...
   this.dosomething();
}
//end = System.currentTimeMillis();
//System.out.println(end - start);
4

6 回答 6

4

只需使用分析器。它将以最小的占用空间自动检测您的代码,显示各种统计数据和热点。查看JVisualVM 、JProfilerYourKit中内置的分析器。

当您不需要它时,您无需为此支付任何费用。

于 2012-10-28T08:02:03.560 回答
2

您可以使用它annotation processing来创建compile time annotations和生成源代码。

本文讨论如何Properties via Annotation Processing使用注释生成代码。您可以定义自定义注释,如@Start, @End@Calculate并像下面这样使用它们。如果您不生成源代码,它们无论如何都会被删除。

@Start
{
      ...
      this.dosomething();
}
@End
@Caclulate

注意:它不能修改被检查的代码,所以你需要创建子类。

于 2012-10-28T07:44:52.517 回答
1

通过从一开始就将用于性能测量的代码与主要代码分开。执行以下操作之一:

  • 正如他的回答中所描述的chm052,带有一些标志和受保护的命令;
  • 通过使用带有这些受保护命令的日志框架,例如SLF4J
  • 通过使用(微)基准测试工具,它可以帮助您进行良好的时间测量、统计和受保护的命令(例如通过 AspectOrientedProgramming)。您绝对应该使用这样的工具来获得明智的测量结果(参见例如https://stackoverflow.com/a/7120803/750378)。
于 2012-10-28T07:46:07.523 回答
1

chm052 提出的方法肯定行得通,但是它将时间测量时间逻辑耦合到您的业务方法中,这是不可取的。毕竟编写方法来执行“dosomething()” - 在这些之前和之后你想要测量时间。明天你会想要记录语句链接“进入方法/离开方法doSomething”,过一段时间你可能想要检查这段代码是否可以运行的权限。

我希望你明白我的意思,虽然这种方法适用于简单的项目,但它会污染你的代码,带来不相关的问题

有几种技术。

  1. AOP,这已经由 Joachim Isaksson 提出。AOP 确实在这方面大放异彩。创建一个建议,您将在其中使用您的时间测量逻辑,然后您就可以开始了。

  2. 如果你想/需要坚持 OOP 技术,我建议你创建一个代理装饰器

从技术上讲,它真的很接近,只是你如何记住你关心的意图。

希望这可以帮助

于 2012-10-28T07:46:52.733 回答
1

如果你只是想要一些简单的东西,debug当你想要打印调试信息时,你总是可以有一个(布尔)变量为真,例如:

if (debug) start = System.currentTimeMillis();
{
   ...
   this.dosomething();
}
if (debug) {
    end = System.currentTimeMillis();
    System.out.println(end - start);
}

当我这样做时,我经常debug使用命令行参数进行设置,因此无需更改代码即可切换调试模式。

编辑:如果您可能想在程序的其他地方重复此结构,我肯定会使用其他答案中提到的 AOP。

于 2012-10-28T07:34:56.447 回答
-1

我不是很清楚你的意思。如果你只是想注释代码,那么快捷键是 eclipse 中的 ctrl+/。如果你尝试在你的项目中编写这种代码,你可以使用 log4j 来做这种事情。

于 2012-10-28T07:43:05.190 回答