我有一个Java程序,我正在尝试使用新算法进行平方根,并将它们与Java中的本地Math.sqrt(a)
方法进行比较。我觉得奇怪的是,第一次在程序中调用.sqrt(a)
方法时,它至少需要50,000ns,而之后的时间只需要几千。这是否与在运行程序的最初几分钟内如何计算系统时间有关,还是由于某种原因实际执行的方法较慢?
答案 0 :(得分:3)
启动Java应用程序会产生很大的开销。
output_df.show(n=3)
+---+---+---+
| a| b| c|
+---+---+---+
| 1| 3| 4|
| 4| 6| 8|
| 7| 9| 12|
+---+---+---+
可执行文件)。所有这些都会增加重要的启动成本...与(比方说)用C或C ++实现,编译并链接到可执行文件的应用程序相比。
但是,应该与Java中的开发和基准测试算法相关。您只需要以消除“JVM预热”开销的方式进行基准测试。有关详细信息:
@ user7859067评论:
需要非常棒的表现,去原生。
我认为你的意思是......将代码实现为Java本机方法。这对JVM引导开销没有帮助。而“go native”并不总是一个胜利,因为从Java调用自定义本机方法时会产生开销。
然而,事实上许多java
函数的实现都是本机代码...以提高速度。 (JIT编译器有调整来生成对“内部”本机方法的特殊快速调用,但是(AFAIK)你不能在不修改JRE代码库的情况下自己使用它...)无论如何,如果你比较你的(纯Java)实现的性能与标准(本机)Math
方法相比,您正在比较苹果和橙子。