Java应用程序运行速度比应该慢

时间:2014-02-16 14:32:17

标签: java

我有一个很长的方法,包含大约350行。这是另一种方法在循环中使用的常规方法,并且它多次使用它(我在这里谈论的数字大于10万)。

例程方法有许多依赖于某些计算的条件分支。 每个分支中的计算如下所示:

...
double cosValue = Math.cos(finalAngle);
double sinValue = Math.sin(finalAngle);
double baFirst_rotated_x = b.getA().getFirst().getxCentroid() * cosValue - b.getA().getFirst().getyCentroid() * sinValue;
...

所以所需的堆空间不是很小。该应用程序工作正常,但它真的很慢。

奇怪的是,当我添加系统调用时,例如,它运行得更快(比快10倍)。所以当我把这个

System.out.println("..."); or System.gc();

在常规方法中,它表现更好。看起来系统调用会以某种方式取消暂停应用程序。有人可以给我一个提示,为什么会发生这种情况?我知道这是一个非常无限期的问题,我为此道歉。我只是认为必须对实际发生的事情做出解释,我不能不知道它继续前进。

1 个答案:

答案 0 :(得分:1)

为了找到瓶颈,我建议尝试自Java 6u7以来作为SDK一部分的VisualVM工具。这很容易尝试,并且它在很多场合严重帮助我实现了大规模的改进。

这是你做的:

  1. 启动您的应用程序,并准备好运行缓慢的操作。不要运行它,只需单击即可开始。
  2. 启动VisualVM,它应位于$JAVA_HOME/bin/jvisualm
  3. 在左侧的应用程序标签中,找到您的慢应用程序并双击
  4. 点击采样器标签。准备好后,单击 CPU 按钮,然后在应用程序中启动慢速步骤,完成步骤后返回VisualVM并停止采样。
  5. 点击快照并检查主题:查看时间时间(CPU)列。有趣的线程是时间(CPU)大于0且小于时间的线程。通常,您可以忽略任何AWT和数据库线程,也可能忽略其他类型,具体取决于您的应用程序。这应该只留下几个线程来看待。展开它们以深入研究耗时的方法。

    使用此技术,您将拥有应用程序花费时间的确切位置。我必须说,结果每次都让我感到惊讶:即使在一个充满低效代码的代码中,通常只有一些真正重要的痛点,而且它们通常根本不明显,直到你用这个工具找到它们。试一试!

    文档:http://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/