简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能 ...

打印 上一主题 下一主题

主题 504|帖子 504|积分 1512

前言

最近简单学了下Rust,以我这种菜鸟程度,没感受到什么安全、性能什么方面的优势,只觉得概念太多,编译各种报错。暂时也写不出来什么玩法,索性对比下各种学过的语言的性能。部分语言很早之前学过,很久不用就忘了,以是是用GPT写的。但运行逻辑很简单,以是应该没什么影响。具体的代码可以见“实验代码”部分。
对比方法是在同一台机器上计算斐波拉契数,获取运行时长和内存占用。对比方法很野鸡,看看当个乐就行。
根据个人工作经验来说,大部分业务场景性能只要够用就行,能尽快下班的语言就是好语言。
实验预备


  • 测试主机:假造机

    • 系统:Debian 12.5 x86_64
    • CPU:4 核
    • 内存:4 GB

使用time命令计算运行时长和内存消耗。示例,计算C二进制步调的运行时长和内存
  1. /usr/bin/time -f 'Elapsed Time: %e s Max RSS: %M kbytes' ./fib-c 45
  2. # 输出结果
  3. The 45th Fibonacci number is 1134903170
  4. Elapsed Time: 8.36 s Max RSS: 1444 kbytes
复制代码
部分语言需要编译,二进制文件和代码如下,C编译出来的二进制文件只有16KB。
  1. -rwxr-xr-x 1 atlas atlas  16K Mar 16 16:21 fib-c  # C编译的二进制文件
  2. -rwxr-xr-x 1 atlas atlas 1.8M Mar 16 15:56 fib-go  # Go编译的二进制文件
  3. -rwxr-xr-x 1 atlas atlas 7.7M Mar 16 17:47 fib-graalvm  # GraalVM编译的二进制文件
  4. -rw-r--r-- 1 atlas atlas  175 Mar 16 18:06 fib-js.js  # JavaScipt源代码文件
  5. -rw-r--r-- 1 atlas atlas  643 Mar 16 16:48 fib-lua.lua  # lua 代码文件
  6. -rw-r--r-- 1 atlas atlas  377 Mar 16 16:49 fib-lua.luac  # LuaJIT编译文件
  7. -rw-r--r-- 1 atlas atlas  981 Mar 16 19:17 Fibonacci.class  # javac编译文件
  8. -rw-r--r-- 1 atlas atlas  622 Mar 16 17:18 Fibonacci.java  # Java源代码文件
  9. -rw-r--r-- 1 atlas atlas  322 Mar 16 16:31 fib-python.py  # python源代码文件
  10. -rwxr-xr-x 1 atlas atlas 3.7M Mar 16 15:56 fib-rust  # rust编译的二进制文件
复制代码
实验结果

递归计算数值 45 的斐波拉契数,确保计算出来的值都是1134903170。
根据结果数据来看,Java(OpenJDK)计算最快,但内存占用相称高,接近rust运行内存的20倍。换成GraalVM编译后,内存占用会少许多,但还是比Rust和C要多。
C的内存占用最低,Rust和C根本齐平,二者运行时长也差不多。
Python最慢,料想之中。。但Python平常个人写的也许多,开发速度相称快。
Go平常也经常写,速度和内存占用都尚可,语法也很简单。写习惯了Go的并发语法,再写其它语言就有点感觉怪怪的。
Lua使用自己的表明器运行是很慢的,用luajit编译后服从提拔许多。
JS并不熟,完全用GPT给的测试方案。运行速度还行,就是内存占用比Java都高。貌似也有其它js运行时,可能性能比nodejs要好。
语言版本运行时长(seconds)环比Rust(越低越好)最大内存占用(kbytes)环比Rust(越低越好)JavaOpenJDK 17.0.22.75-69.7%38056+1932.9%JavaGraalVM 21.0.2+13.14.37-51.8%6980+272.9%Python3.11.2112.13+1136.3%9364+400.2%Go1.21.64.88-46.2%3396+81.4%Cgcc 12.2.08.36-7.8%1444-22.9%Rust1.76.09.07018720LuaLua 5.474.22+718.3%2668+42.5%LuaLuaJIT 2.1.0-beta317.09+88.42%2296+22.6%Nodejsv20.10.09.18+1.2%45248+2317.1%


实验代码

Java
  1. public class Fibonacci {
  2.     public static int fib(int n) {
  3.         if (n <= 2) {
  4.             return 1;
  5.         }
  6.         return fib(n - 2) + fib(n - 1);
  7.     }
  8.     public static void main(String[] args) {
  9.         if (args.length < 1) {
  10.             System.out.println("Usage: java Fibonacci NUMBER");
  11.             return;
  12.         }
  13.         
  14.         try {
  15.             int num = Integer.parseInt(args[0]);
  16.             System.out.println(String.format("The %dth Fibonacci number is %d", num, fib(num)));
  17.         } catch (NumberFormatException e) {
  18.             System.out.println("Invalid number provided.");
  19.         }
  20.     }
  21. }
复制代码
JavaScript

[code]function fib(n) { if (n

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表