如何知道我的代码的哪一部分需要更多的CPU

时间:2013-03-23 11:50:07

标签: java recursion time complexity-theory

我想知道我的代码的哪些行正在使用大部分时间执行。我正在做一个计划程序算法,为了解决我所做的具体问题,计算机需要5分钟才能找到解决方案。

我使用了很多递归方法,我想知道浪费的时间最多,所以我可以查看这些行并尝试修复或重构代码以查看它是否有帮助。

我知道有Cyclomatic Complexity Methods。但我不知道如何在Eclipse上使用它。我正在使用Helios。试图安装metrics2,它只是在我的Eclipse上弹出错误。

编辑:更新的问题:

http://s7.postimg.org/frd8yjql5/diag.png 这意味着什么?看看堆大小..总是上下..这会影响CPU速度吗?谢谢!

3 个答案:

答案 0 :(得分:4)

  

我想知道我的代码的哪些行正在使用大部分时间执行。

使用分析器运行代码。 Eclipse具有分析支持,但我建议使用作为JDK - VisualVM的一部分提供的分析器。

(我不会从分析“大O”的复杂性开始。首先介绍一下,这将告诉你从哪里开始寻找。然后你可能想要正式或非正式地查看热点的算法复杂性。)

  

我知道有Cyclomatic Complexity Methods。

圈复杂度不是性能的预测指标。它(据说)是代码可维护性的衡量标准,而不是计算复杂性。同样可能是“metrics2”的东西,虽然我不熟悉它。

答案 1 :(得分:2)

首先从抽象分析开始,然后进入细节和测量。

摘要分析

对于分析,我会在big O notation中查看算法的复杂性。这是对运行时的抽象分析(而Cyclomatic Complexity等指标则考虑代码质量)。

对于算法分析,我发现Cormen的书"Introduction to algorithms"非常好。

当您了解算法的复杂性时,您可以检查替代算法是否更好或者在何处进行算法改进。

测量

避免使用premature optimization:只有当您确定自己拥有良好的算法时,才应详细说明并进行衡量。

要检查您的理论分析是否正确并查看技术实施(主要是搜索热点并优化热点),您可以使用macro benchmarking toolsJVisualVM等分析器。

答案 2 :(得分:1)

在大多数情况下,探查器是最好的,但有时最好使用简单的秒表:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Stopwatch.html

Basic usage:

Stopwatch stopwatch = new Stopwatch().start();
doSomething();
stopwatch.stop(); // optional

long millis = stopwatch.elapsed(MILLISECONDS);

log.info("that took: " + stopwatch); // formatted string like "12.3 ms"