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

时间:2017-04-19 01:33:03

标签: java

我有一个Java程序,我正在尝试使用新算法进行平方根,并将它们与Java中的本地Math.sqrt(a)方法进行比较。我觉得奇怪的是,第一次在程序中调用.sqrt(a)方法时,它至少需要50,000ns,而之后的时间只需要几千。这是否与在运行程序的最初几分钟内如何计算系统时间有关,还是由于某种原因实际执行的方法较慢?

1 个答案:

答案 0 :(得分:3)

启动Java应用程序会产生很大的开销。

  • 需要加载JVM(output_df.show(n=3) +---+---+---+ | a| b| c| +---+---+---+ | 1| 3| 4| | 4| 6| 8| | 7| 9| 12| +---+---+---+ 可执行文件)。
  • JVM需要引导:
    • 创建和初始化堆
    • 类加载各种系统类
  • 您的课程需要分类。这通常会触发系统类,第三方库等的进一步类加载。
  • 稍后...... JIT编译器开始将方法编译为本机代码。
  • 发生这种情况时,GC可能会运行以清理由JIT编译和类加载创建的垃圾。

所有这些都会增加重要的启动成本...与(比方说)用C或C ++实现,编译并链接到可执行文件的应用程序相比。

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

@ user7859067评论:

  

需要非常棒的表现,去原生。

我认为你的意思是......将代码实现为Java本机方法。这对JVM引导开销没有帮助。而“go native”并不总是一个胜利,因为从Java调用自定义本机方法时会产生开销。

然而,事实上许多java函数的实现都是本机代码...以提高速度。 (JIT编译器有调整来生成对“内部”本机方法的特殊快速调用,但是(AFAIK)你不能在不修改JRE代码库的情况下自己使用它...)无论如何,如果你比较你的(纯Java)实现的性能与标准(本机)Math方法相比,您正在比较苹果和橙子。