Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道代码的哪一部分占用更多CPU_Java_Recursion_Time_Complexity Theory - Fatal编程技术网

Java 如何知道代码的哪一部分占用更多CPU

Java 如何知道代码的哪一部分占用更多CPU,java,recursion,time,complexity-theory,Java,Recursion,Time,Complexity Theory,我想知道我的代码中哪些行在执行的大部分时间都在使用。我正在做一个计划者算法,为了解决我提出的一个具体问题,计算机需要5分钟才能找到解决方案 我使用了很多递归方法,我想知道在哪里浪费的时间最多,所以我可以查看这些行并尝试修复或重构代码,看看是否有帮助 我知道有圈复杂度方法。但我不知道如何在Eclipse上使用它。我用的是太阳神。试图安装metrics2,但它只是在我的Eclipse上弹出错误 编辑:较小的新问题: 这意味着什么?看看堆的大小。。总是上下波动。。这会影响CPU速度吗?谢谢 首先从抽

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

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

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

编辑:较小的新问题:


这意味着什么?看看堆的大小。。总是上下波动。。这会影响CPU速度吗?谢谢

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

抽象分析 对于分析,我将在下面的示例中查看您的算法的复杂性。这是对运行时的抽象分析(而圈复杂度等指标则关注代码质量)

对于算法分析,我觉得科尔曼的书非常好

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

测量 避免:只有当你确信自己有一个好的算法时,你才应该深入细节并进行测量


要检查您的理论分析是否正确,并查看技术实现(主要是搜索热点和优化热点),您可以使用和探查器,如。

在大多数情况下,探查器是最好的,但有时最好使用简单的秒表:

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

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

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

我知道有圈复杂度方法


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

为什么不使用探查器,例如?首先在首选的Internet搜索工具的帮助下查看
java profiling
。评测是您想要的,如果您下载netbeans IDE,它会附带一个基本的cpu探查器,只需单击profile->attach profiler,并在单击next之前选择cpu profiler。非常感谢您的帮助,我将搜索VisualVM并尝试安装:)jvisualvm自Java 6更新7以来已与JDK捆绑在一起。是的,在搜索时,我已经找到了如何运行它的教程:)谢谢;)非常感谢你的建议,但实际上我没有太多时间使用表达式和数学进行如此深入的分析,我正在寻找更实用的方法并及时发现它。但我要再次说,非常感谢您的帮助,我将从JVisualVM;)开始不客气。希望您有足够的时间查看我的“早熟优化”链接,因为技术调整通常只会使解决方案的速度加快一小部分,而更好的算法会带来很大(甚至是指数级)的改进。简言之:没有什么比好的理论更实用的了;)是的,这是真的,但我诚实地认为这个算法是最好的(GraphPlan),我可能也做错了什么。。没错。哦,这不是你自己的,而是一种流行的算法,IC。那么,还有其他java实现可以用来比较运行时吗?嗨,Darkink,是的,这就是垃圾收集。看起来内存使用率没有达到最大值,gc不是您的运行时瓶颈(左图)。因此,如果您有一些(软)实时限制,我只会担心gc。非常感谢您的帮助;)如果您选择以这种方式进行基准测试,那么值得一看henry,我真正希望看到的是像eclipse的调试模式一样执行的代码行。。因此,我可以分析哪些行在大多数情况下执行。。你看到了吗?在调试模式下,我需要单击以推进每个步骤。。
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"