我有一个很长的方法,包含大约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();
在常规方法中,它表现更好。看起来系统调用会以某种方式取消暂停应用程序。有人可以给我一个提示,为什么会发生这种情况?我知道这是一个非常无限期的问题,我为此道歉。我只是认为必须对实际发生的事情做出解释,我不能不知道它继续前进。
答案 0 :(得分:1)
为了找到瓶颈,我建议尝试自Java 6u7以来作为SDK一部分的VisualVM工具。这很容易尝试,并且它在很多场合严重帮助我实现了大规模的改进。
这是你做的:
$JAVA_HOME/bin/jvisualm
点击快照并检查主题:查看时间和时间(CPU)列。有趣的线程是时间(CPU)大于0且小于时间的线程。通常,您可以忽略任何AWT和数据库线程,也可能忽略其他类型,具体取决于您的应用程序。这应该只留下几个线程来看待。展开它们以深入研究耗时的方法。
使用此技术,您将拥有应用程序花费时间的确切位置。我必须说,结果每次都让我感到惊讶:即使在一个充满低效代码的代码中,通常只有一些真正重要的痛点,而且它们通常根本不明显,直到你用这个工具找到它们。试一试!
文档:http://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/