Java 17的计算速度比Java 8慢?

这篇博客通过对比Java 8和Java 17在计算斐波那契数列上的性能,发现现代Java(Java 17)在特定计算任务上可能比旧版本(Java 8)表现更差。作者通过实验展示了Java 17在斐波那契数列计算上的速度较慢,并提供了源代码供下载验证。结论指出,对于计算密集型任务,开发者可能需要谨慎选择Java版本。
摘要由CSDN通过智能技术生成

尽管最近的一些特性可能会产生 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下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值