如何查看完成方法调用所花费的时间?

How can I see the time taken to complete a method call?

我想做一些研究来提高我的程序员技能,看看一个方法需要多长时间才能完成。

但是我不想在我正在测试的java文件中编写任何代码,因为我有很多方法要测试(对于某些代码我没有编辑代码的权限) 所以如果可能的话我只想 "watch" 方法。

例如:

public void methodZero(){
  methodOne();
  methodTwo();
}

理想情况下应该打印如下内容:

Time of methodZero = x. Time of methodOne = y. Time of methodTwo = z.

问题:我可以这样测量时序吗?是否有一些对我很重要的附加信息,例如内存使用情况?

long startTime = System.nanoTime();
methodOne();
long endTime = System.nanoTime();
long duration = (endTime - startTime);

作为程序员,您应该对算法的复杂性(通常是时间复杂性,但有时您也应该担心 Space 复杂性)更感兴趣,而不是执行程序所花费的实际时间。 阅读 here 分析算法复杂度

孤立地对方法计时通常是完全没有意义的,首先您需要统计样本。如果你想为一个方法获得 运行 次,你必须考虑很多事情,并尽可能多地为你的计时目标提供背景信息。

例如,假设您的方法有一个 return 值,但您没有在基准测试中以任何方式使用它 - 您可能会遇到 JVM 的 "dead-code elimination",它让你的时间变得毫无意义。 JVM 做了很多像这样的聪明事情 (openjdk.net: Performance techniques used in the Hotspot JVM),所有这些都使有意义的计时变得混乱和复杂。

JMH.

一个很好的库可以帮助你做到这一点(它也有很好的文档和教程)

测量算法 space and time complexity 与实际计时同样重要,但通常与采取有意义的计时相关。这使您可以了解您的算法将如何随着输入数据集大小的变化而增长。例如,MethodA 在小输入数组上可能更快,而在输入数组大 100 倍时慢得不切实际,而 MethodB 可能需要相同的时间,而不管数组大小如何。

如果您想找出程序中应该从哪里着手提高性能,您可以使用探查器 (e.g. eclipse.org: An introduction to profiling Java applications)。这将帮助您识别诸如以下内容:高内存使用率、高 GC 使用率、总方法时间(例如,方法调用次数少但执行时间长,或者调用次数多但执行时间少但执行时间长)。但是,分析器也会影响程序的执行时间。

TL;DR:分析和性能测试很难。通常你并没有真正衡量你认为你正在衡量的东西。