5

我想知道我的代码的哪些行在执行的大部分时间都在使用。我正在做一个规划器算法,要解决我提出的特定问题,计算机需要 5 分钟才能找到解决方案。

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

我知道有圈复杂度方法。但我不知道如何在 Eclipse 上使用它。我正在使用 Helios。试图安装metrics2,它只是在我的Eclipse 上弹出错误。

已编辑:较小的新问题:

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

4

3 回答 3

4

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

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

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

我知道有圈复杂度方法。

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

于 2013-03-23T12:00:09.403 回答
2

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

摘要分析

对于分析,我会以大 O 表示法查看您的算法的复杂性。那是对运行时的抽象分析(而像 Cyclomatic Complexity 这样的指标着眼于代码质量)。

对于算法分析,我觉得 Cormen 的《算法简介》一书非常好。

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

测量

避免过早优化:只有当你确定你有一个好的算法时,你才应该深入细节和衡量。

要检查您的理论分析是否正确并查看技术实现(主要是搜索热点并优化它们),您可以使用宏基准测试工具JVisualVM 之类的分析器。

于 2013-03-23T11:55:07.320 回答
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"
于 2013-03-23T11:57:38.930 回答