Java应用程序的运行速度比应该的慢
我有一个很长的方法,由大约350行组成。这是一种常规方法,另一种方法在一个循环中使用,并且使用了很多次(我在这里谈论的是大于100000的数字) 常规方法有许多依赖于某些计算的条件分支。 每个分支中的计算如下所示:Java应用程序的运行速度比应该的慢,java,Java,我有一个很长的方法,由大约350行组成。这是一种常规方法,另一种方法在一个循环中使用,并且使用了很多次(我在这里谈论的是大于100000的数字) 常规方法有许多依赖于某些计算的条件分支。 每个分支中的计算如下所示: ... double cosValue = Math.cos(finalAngle); double sinValue = Math.sin(finalAngle); double baFirst_rotated_x = b.getA().getFirst().getxCentroi
...
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();
在常规方法中,它的性能更好。看起来系统调用以某种方式解除了应用程序的暂停。有人能告诉我为什么会发生这种事吗?我知道这是一个非常不确定的问题,我为此道歉。我只是认为必须对实际发生的事情进行解释,我不能不知道就继续前进。要找到瓶颈,我建议尝试VisualVM工具,它是Java 6u7以来SDK的一部分。这是一个非常容易尝试的方法,它在很多情况下都帮助我取得了巨大的进步 以下是您要做的:
$JAVA\u HOME/bin/jvisualm
文档:可能您占用了太多内存,系统开始将页面交换到虚拟内存,这会降低速度。使用GC,未使用但仍被占用的内存将可以自由使用。您确定您正确地进行了基准测试吗?也就是说,是热身还是长时间跑步?在Java中进行正确的基准测试是困难的,因为JVM在运行时会不断重新编译代码。另外,我如何用Java编写正确的微基准测试?为什么你已经接受了答案?你还没弄清楚发生了什么。