我有一个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
方法,您正在比较苹果和橙子。