如何检查方法的哪个部分使用最多时间?

时间:2013-02-28 14:16:41

标签: java profiling micro-optimization

我正在开发一个优化现有算法的项目。我用JIP和VisualVM描述了代码,并且遇到了一个主要的瓶颈。

现在我想看看方法花费的时间最多。有什么简单的方法可以做到这一点?是否存在可以为我提供信息的分析器,或者我是否需要开始计算方法中的每个步骤并将其写入文件?

编辑:这应该是代码在inputsets上运行

编辑2:我正在谈论的方法被称为1亿次+次,运行时总计+/- 500秒。因此,代码中的每个优化都将有显着的改进。

3 个答案:

答案 0 :(得分:1)

如果您正在寻找在执行代码时分析代码的工具,您需要调查dynamic analysis tools。文章中提到了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

请注意,静态分析是在代码上执行的,而不实际执行代码。

答案 1 :(得分:0)

JUnitBenchmarks可以提供帮助。那些带有时间戳的'强力'类型的支票

方法的相关部分之间?

答案 2 :(得分:0)

不要通过测量时间来做到这一点。

通过在调试器中抓取快照来实现。这将向您展示它正在做的最好的水平。 无论它在做什么,如果你抓住它在两个或更多快照上做它 - 认为它是一个错误。 如果你可以避免它,你将节省大量的时间。

多少时间?你会发现什么时候修复它,但看到它两次拍摄的快照越少,你就会节省得越多。

如果你害怕它不会发现“问题”,不要担心,它会,这可能是你没想到的。 More on all that ...