我正在开发一个优化现有算法的项目。我用 JIP 和 VisualVM 分析了代码,发现了一个主要瓶颈。
现在我想看看在方法中花费最多时间的是什么。有什么简单的方法可以做到这一点?是否有分析器可以为我提供该信息,或者我是否需要开始计时方法中的每个步骤并将其写入文件?
编辑:这应该是代码在输入集上运行时
编辑 2:我正在谈论的方法被称为 1 亿次以上,总运行时间为 +/-500 秒。所以代码中的每一次优化都会有显着的提升。
我正在开发一个优化现有算法的项目。我用 JIP 和 VisualVM 分析了代码,发现了一个主要瓶颈。
现在我想看看在方法中花费最多时间的是什么。有什么简单的方法可以做到这一点?是否有分析器可以为我提供该信息,或者我是否需要开始计时方法中的每个步骤并将其写入文件?
编辑:这应该是代码在输入集上运行时
编辑 2:我正在谈论的方法被称为 1 亿次以上,总运行时间为 +/-500 秒。所以代码中的每一次优化都会有显着的提升。
如果您正在寻找在代码执行时分析代码的工具,您将需要研究动态分析工具。文章中提到了 JTest(用于 Java),但恐怕我还没有使用过它。
您也可以使用像soot这样的静态代码分析工具,取得不同程度的成功。这些工具将识别代码中执行时间最长的区域。
其他包括:SonarJ, PMD, Kalistick
我使用 soot 等工具的方式是将其绑定到我的构建管理工具中。所以对于maven,它会被配置成这样:
<plugin>
<groupId>net.ju-n.maven.plugins</groupId>
<artifactId>soot-maven-plugin</artifactId>
<version>0.1.1</version>
<executions>
<execution>
<goals>
<goal><!-- put the goal name here --></goal>
</goals>
</execution>
</executions>
<configuration>
<!-- put your configurations here -->
</configuration>
</plugin>
然后我会将其配置为在 Maven 配置文件中运行(最好在构建服务器上)并发布结果。
执行的目标是:mvn soot:soot
请注意,静态分析是在代码上执行的,而不是实际执行代码。
JUnitBenchmarks可以提供帮助。带有时间戳的“蛮力”检查怎么样?
方法的相关部分之间?
不要通过测量时间来做到这一点。
通过在调试器中抓取快照来做到这一点。这将向您展示它正在做的最好的水平。不管它在做什么,如果你在两个或更多快照上发现它在做 - 认为它是一个错误。如果你能避免它,你将节省大量时间。
多少时间?当你修复它时你会发现,但是看到它两次的快照越少,你保存的越多。
如果你害怕它找不到“问题”,别担心,它会的,而且这可能是你没想到的。更多关于这一切......