Square Root方法需要很长时间才能执行第一次尝试



我有一个Java程序,我正在尝试将新算法用于正方形生根,并将它们与Java中的本机Math.sqrt(a)方法进行比较。我发现很奇怪的是,该程序中第一次调用.sqrt(a)方法,至少需要50,000NS,而随后的时间仅需几千。这与在运行程序的最初瞬间计算系统时间有关,还是由于某种原因执行较慢的方法?

在启动Java应用程序时有明显的开销。

  • 需要加载JVM(java可执行文件(。
  • JVM需要引导:
    • 创建和初始化堆
    • 分类负载各种系统类
    • 等等
  • 您的课程需要上课。这通常会触发系统类,第三方库等的进一步的分类。
  • 一点点... JIT编译器开始将方法编译为本机代码。
  • 在发生这种情况时,GC可能会运行以清理由JIT编译和class Loading创建的垃圾。

所有这些加起来大量启动成本...与(例如(在C或C 中实施的应用程序相比,已编译并链接到可执行文件。

但是,此应该与Java中的开发和基准测试算法相关。您只需要以消除" JVM热身"开销的方式进行基准测试。有关更多详细信息:

  • 如何在Java中编写正确的微基准?

@user7859067评论:

需要非常出色的表演,请去本地。

我认为您的意思是...将代码作为Java本机方法实现。这无助于JVM Bootstrap开销。而且"求助"并不总是一场胜利,因为从java呼叫自定义本机方法时有间接费用。

但是,许多Math函数的实现都在本机代码中...速度。(JIT编译器对"内在"本机方法的特殊快速呼叫进行了调整,但是(AFAIK(您不会在不修改JRE代码库的情况下自己使用它...(无论如何,如果您比较了(纯Java(实现的性能根据标准(本机(Math.sqrt方法,您正在比较苹果和橙子。

最新更新