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

Java应用程序的运行速度比应该的慢,java,Java,我有一个很长的方法,由大约350行组成。这是一种常规方法,另一种方法在一个循环中使用,并且使用了很多次(我在这里谈论的是大于100000的数字) 常规方法有许多依赖于某些计算的条件分支。 每个分支中的计算如下所示: ... double cosValue = Math.cos(finalAngle); double sinValue = Math.sin(finalAngle); double baFirst_rotated_x = b.getA().getFirst().getxCentroi

我有一个很长的方法,由大约350行组成。这是一种常规方法,另一种方法在一个循环中使用,并且使用了很多次(我在这里谈论的是大于100000的数字)

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

...
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的一部分。这是一个非常容易尝试的方法,它在很多情况下都帮助我取得了巨大的进步

以下是您要做的:

  • 启动您的应用程序,并准备运行速度较慢的程序。现在还不运行它,只需单击即可开始
  • 启动VisualVM,它应该位于
    $JAVA\u HOME/bin/jvisualm
  • 在左侧的应用程序选项卡中,找到您的慢速应用程序并双击
  • 单击采样器选项卡。准备就绪后,单击CPU按钮,然后在应用程序中开始缓慢的步骤,当该步骤完成后,返回VisualVM并停止采样
  • 单击快照并检查线程:查看时间时间(CPU)列。有趣的线程是时间(CPU)大于0且小于时间的线程。通常,您可以忽略任何AWT和数据库线程,也可能忽略其他类型的线程,具体取决于您的应用程序。这应该只剩下几个线程来查看。展开它们以深入了解耗时的方法

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


    文档:

    可能您占用了太多内存,系统开始将页面交换到虚拟内存,这会降低速度。使用GC,未使用但仍被占用的内存将可以自由使用。您确定您正确地进行了基准测试吗?也就是说,是热身还是长时间跑步?在Java中进行正确的基准测试是困难的,因为JVM在运行时会不断重新编译代码。另外,我如何用Java编写正确的微基准测试?为什么你已经接受了答案?你还没弄清楚发生了什么。