Java 17的計算速度比Java 8慢? - marian
儘管最近的一些特性可能會產生 Java 進化的錯覺,但自 Java 8 以來 Java 語言並沒有太大變化。
一些內建類有改進,但 Java 效能的整體改進並不容易察覺。
如果現代 Java 效能明顯下降怎麼辦?
Java中的計算任務
Java 的效能不如 Python,但更方便用於計算。讓我們進行最簡單的實驗,看看現代 Java 的計算能力發生了什麼變化。
任何人都知道的標準計算是斐波那契數的計算。在 Java 中,它可以通過平行計算同步完成,甚至更快。甚至還有一個專門的類RecursiveTask,所以程式碼不像 JavaScript 或 Python 那樣複雜。我嘗試兩種方法來計算斐波那契數。
在我的程式碼中,我重用了來自RecursiveTask. API 建議不要為位置 10 之前的數字啟動新任務。
public class Main { static long fibonacci(long n) { if (n <= 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } class Fibonacci extends RecursiveTask<Long> { final long n; Fibonacci(long n) { this.n = n; } protected Long compute() { if (n <= 10) { return fibonacci(n); } Fibonacci f1 = new Fibonacci(n - 1); f1.fork(); Fibonacci f2 = new Fibonacci(n - 2); return f2.compute() + f1.join(); } } Map<String, List<Long>> results = new HashMap<>(); void execute(IntFunction<Long> code, int num, String name) { long start = System.currentTimeMillis(); long r = code.apply(num); long time = System.currentTimeMillis() - start; results.computeIfAbsent(name, k -> new LinkedList<>()).add(time); System.out.println(r + " in " + time + " ms"); } void run(int num, int repeats) { for (int i = 0; i < repeats; i++) { execute(n -> fibonacci(n), num, "one"); execute(n -> new Fibonacci(n).compute(), num, "multi"); } results.forEach((k, v) -> System.out.println(k + " " + v.stream().mapToLong(l -> l).average().getAsDouble())); } public static void main(String... args) { new Main().run(Integer.valueOf(args[0]), Integer.valueOf(args[1])); } } |
該程式碼期待兩個數字--斐波那契數列中的數字和重複計算目標數字的次數。最後,程式碼顯示了同步和併發計算目標數的平均時間。
該程式碼沒有vars等現代功能,因為它也將由Java 8執行。
在Java中,編譯器版本很重要。當用 javac 8 編譯的程式碼在 java 17 上執行時,奇怪的事情發生了。為了儘可能準確,我把相同的程式碼用Java 8編譯器編譯成fibonacci8.jar,用Java 17編譯成fibonacci17.jar。
使用以下命令啟動的 jar 的輸出結束:"C:\Program Files\Java\jdk1.8.0_121\bin\java" -jar fibonacci8.jar 40 100
將上述 100 次重複的平均值與使用 啟動的 jar 的輸出中的平均值進行比較:"C:\Program Files\Java\jdk-17.0.1\bin\java -jar fibonacci17.jar 40 100"
Java 17 在計算任務上似乎慢 (487–444)/444=9% 和 (280–241)/241=16%。這難以置信。讓我們嘗試另一個數字,45,但只計算了 20 次,因為如您所見,計算需要時間。
現在差異變小了 (5099–4895)/4895=4% 和 (2963–2783)/2783=6%
讓我們試試另一個數字,45,但只計算了 5 次。
您再次看到 Java 17 輸給了 Java 8:(13981–12854)/12854=8% 和 (7982–6927)/6927=15%
結論
確實需要小心使用最新版本的 Java。在某些用例中,例如計算,現代 Java 可能比幾年前釋出的 Java 更糟糕。
原始碼可以從https://github.com/marianc000/fibonacciJava17vs8下載
相關文章
- java 8 - java 17 升級指北Java
- java8平行計算Java
- Java 8 腰斬!Java 17 暴漲 2300%!!Java
- Java Go python 執行速度對比JavaGoPython
- java計算時間差及比較時間Java
- Java計算百分比保留整數Java
- Java排序演算法速度比較(轉載)Java排序演算法
- Java 11 究竟比 8 快了多少?Java
- Java的慢和穩Java
- Java 計算器Java
- java計算時間差及比較時間大小Java
- 網站速度慢,網站速度慢,網站速度慢的幾種原因分析網站
- Java I/O流 複製檔案速度對比Java
- Java8 學習之計算日期相差天數Java
- 動態切換JDK8和JAVA17JDKJava
- JDK 17:Java 17 中的新特性 - InfoWorldJDKJava
- 2021-2-17:Java HashMap 的中 key 的雜湊值是如何計算的,為何這麼計算?JavaHashMap
- 【java提高】(17)---Java 位運算子Java
- Java反射慢,到底慢在哪裡?Java反射
- java FileI(O)nputStream為什麼比BufferedI(O)utputStream慢?Java
- 在什麼情況下,Java比C++慢很多?JavaC++
- 計算素數【Java】Java
- 計算Java日期 (轉)Java
- Python 速度比 Java 快,你不得不承認!PythonJava
- Java 17新特性Java
- DELETE 比 SELECT 執行速度慢的測試報告delete測試報告
- Java 8 比較器:如何對 List 排序Java排序
- Java8仍占主導地位,Java11已破防,Java17浪潮還會來嗎?Java
- 收集的Java科學計算庫Java
- 更精確的JAVA運算計時Java
- 向量點積計算javaJava
- java版複利計算Java
- java計算間隔天數Java
- Java浮點數計算Java
- 為什麼你不能拿CPU速度來比較計算機的效能計算機
- SSL延遲計算:為什麼HTTPs比HTTP要慢?HTTP
- Java程式設計基礎17——集合(List集合)Java程式設計
- 17.java設計模式之觀察者模式Java設計模式