【问题标题】:How to know which part of my code takes more CPU如何知道我的代码的哪一部分占用更多 CPU
【发布时间】:2013-03-13 06:12:45
【问题描述】:

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

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

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

已编辑:较小的新问题:

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

【问题讨论】:

  • 为什么不使用分析器,例如VisualVM
  • 借助您首选的互联网搜索工具,首先查看java profiling
  • Profiling 就是你想要的,如果你下载了netbeans IDE,它带有一个基本的cpu profiler,只需点击profile->attach profiler,然后在点击下一步之前选择cpu profiler。

标签: java recursion time complexity-theory


【解决方案1】:

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

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

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

我知道有圈复杂度方法。

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

【讨论】:

  • 非常感谢您的帮助,我会搜索 VisualVM 并尝试安装它:)
  • jvisualvm 自 Java 6 更新 7 以来已与 JDK 捆绑在一起。
  • 是的,在进行搜索时,我已经找到了如何运行它的教程 :) 谢谢 ;)
【解决方案2】:

先从抽象分析开始,然后再深入细节和衡量。

抽象分析

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

对于算法分析,我觉得Cormen的书"Introduction to algorithms"很不错。

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

测量

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

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

【讨论】:

  • 非常感谢您的建议,但实际上我没有太多时间使用表达式和数学进行如此深入的分析,我正在寻找更实用的东西并及时发现。但是我再说一遍,非常感谢您的帮助,我将从 JVisualVM 开始;)
  • 不客气。希望您有足够的时间来查看我的过早优化链接,因为技术调整通常只会使解决方案的速度提高一小部分,而更好的算法会导致大的(高达指数级的)改进。简而言之:没有什么比一个好的理论更实用的了;)
  • 是的,确实如此,但我认为该算法是最好的算法之一(GraphPlan),我也可能做错了什么……没错。
  • 哦,这不是你自己的,而是一种流行的算法,IC。那么还有其他的 java 实现可以用来比较运行时吗?
  • 嗨,DarkLink,是的,那是垃圾收集。看起来内存使用量没有达到最大值,并且 gc 不是您的运行时瓶颈(左图)。因此,如果您有一些(软)实时限制,我只会担心 gc。
【解决方案3】:

在大多数情况下,分析器是最好的,但有时最好使用简单的秒表: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"

【讨论】:

  • 非常感谢您的帮助 ;)
  • 如果您选择以这种方式进行基准测试,code.google.com/p/caliper 值得一看
  • 看亨利,我真正想要的是看到在 Eclipse 的调试模式下执行的代码行。所以我可以分析哪些行最常被执行。你看到了吗?在调试模式下,我需要单击以推进每个步骤..
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2011-06-17
  • 2022-01-12
  • 2021-05-07
  • 2012-02-27
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多