DeepSeek编写的rust和c语言斐波那契数列程序性能比较

首先下载rust编译环境的docker镜像

bash 复制代码
docker pull docker.1ms.run/rust:latest
Trying to pull docker.1ms.run/rust:latest...
Getting image source signatures
Copying blob 48b8862a18fa skipped: already exists
Copying blob b1b8a0660a31 skipped: already exists
Copying blob 3b1eb73e9939 skipped: already exists
Copying blob 0c01110621e0 skipped: already exists
Copying blob 85d73d009ce4 done
Copying config 37a4a73321 done
Writing manifest to image destination
Storing signatures
37a4a73321e80052e6fcd636dcd4ee26c8fa0ed0d655f95d92276efb7e759cc2

docker image list -a |grep rust
docker.1ms.run/rust                          latest      37a4a73321e8  5 weeks ago    1.55 GB

因为很多文件以前别的镜像已经下载过了,实际只新下载了几百MB。

然后运行容器

bash 复制代码
docker run -it -d --net=host -v/mnt/c/d:/par --name rust 37a4a73321e80052 bash
c54df3096932c4ecbedcc97caaa4c73bce44c4fa33fba286426de55c110e0752

docker exec -it rust bash
rustc --version
rustc 1.87.0 (17067e9ac 2025-05-09)

gcc --version
gcc (Debian 12.2.0-14+deb12u1) 12.2.0

可见它自带了gcc 12.2,不需要额外下载。

然后用如下提示词向deepseek提问

请用rust编写计算第n个斐波那契数的程序main.rs,要实现递归和迭代版本,并写一个等价的c程序用于比较

他给出了如下两段代码以及编译命令行

rust

rust 复制代码
use std::env;

// 递归实现
fn fib_recursive(n: u64) -> u64 {
    match n {
        0 => 0,
        1 => 1,
        _ => fib_recursive(n - 1) + fib_recursive(n - 2),
    }
}

// 迭代实现
fn fib_iterative(n: u64) -> u64 {
    if n == 0 {
        return 0;
    }
    
    let mut a = 0;
    let mut b = 1;
    
    for _ in 1..n {
        let c = a + b;
        a = b;
        b = c;
    }
    
    b
}

fn main() {
    let args: Vec<String> = env::args().collect();
    
    if args.len() != 2 {
        eprintln!("Usage: {} <n>", args[0]);
        std::process::exit(1);
    }
    
    let n: u64 = match args[1].parse() {
        Ok(num) => num,
        Err(_) => {
            eprintln!("Error: argument must be a non-negative integer");
            std::process::exit(1);
        }
    };
    
    println!("[Rust Recursive] fib({}) = {}", n, fib_recursive(n));
    println!("[Rust Iterative] fib({}) = {}", n, fib_iterative(n));
}

c

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 递归实现
unsigned long long fib_recursive(unsigned long long n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    return fib_recursive(n - 1) + fib_recursive(n - 2);
}

// 迭代实现
unsigned long long fib_iterative(unsigned long long n) {
    if (n == 0) return 0;
    
    unsigned long long a = 0;
    unsigned long long b = 1;
    
    for (unsigned long long i = 1; i < n; ++i) {
        unsigned long long c = a + b;
        a = b;
        b = c;
    }
    
    return b;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <n>\n", argv[0]);
        return 1;
    }
    
    unsigned long long n = strtoull(argv[1], NULL, 10);
    
    printf("[C Recursive] fib(%llu) = %llu\n", n, fib_recursive(n));
    printf("[C Iterative] fib(%llu) = %llu\n", n, fib_iterative(n));
    
    return 0;
}

然后编译

bash 复制代码
Rust: 
rustc main.rs

C: 
gcc fibonacci.c -o fib

然后运行,比较如下:

bash 复制代码
time ./main 44
[Rust Recursive] fib(44) = 701408733
[Rust Iterative] fib(44) = 701408733

real    0m3.075s
user    0m3.216s
sys     0m0.001s
time ./fib 44
[C Recursive] fib(44) = 701408733
[C Iterative] fib(44) = 701408733

real    0m2.582s
user    0m2.708s
sys     0m0.000s

然后优化编译再次运行,

bash 复制代码
gcc fib.c -o fib -O3
time ./fib 44
[C Recursive] fib(44) = 701408733
[C Iterative] fib(44) = 701408733

real    0m0.470s
user    0m0.489s
sys     0m0.001s
rustc -C opt-level=3 main.rs
time ./main 44
[Rust Recursive] fib(44) = 701408733
[Rust Iterative] fib(44) = 701408733

real    0m1.145s
user    0m1.193s
sys     0m0.001s

然后用cargo的release方式编译和本地代码优化选项编译

bash 复制代码
cargo build --release
   Compiling hello_cargo v0.1.0 (/par/hello_cargo)
    Finished `release` profile [optimized] target(s) in 0.64s

time  target/release/hello_cargo 44
[Rust Recursive] fib(44) = 701408733
[Rust Iterative] fib(44) = 701408733

real    0m1.162s
user    0m1.190s
sys     0m0.002s

rustc -C opt-level=3 -C lto -C codegen-units=1 -C target-cpu=native main.rs
time ./main 44
[Rust Recursive] fib(44) = 701408733
[Rust Iterative] fib(44) = 701408733

real    0m1.090s
user    0m1.179s
sys     0m0.022s

提升不大,rust还是比c程序慢不少,而编译后的文件要大不小,这篇文章一个非常小的 Rust 二进制文件 · Graham King介绍了减少的方法,其中strip命令是最有效的。gcc编译出的文件已经很小了,strip影响不大。

bash 复制代码
ls -l main
-rwxrwxrwx 1 root root 1706328 Jun 21 01:35 main

ls -l  target/release/hello_cargo
-rwxrwxrwx 2 root root 444520 Jun 21 01:32 hello_cargo/target/release/hello_cargo

strip main
ls -l main
-rwxrwxrwx 1 root root 340640 Jun 21 02:05 main

strip hello_cargo/target/release/hello_cargo
ls -l hello_cargo/target/release/hello_cargo
-rwxrwxrwx 2 root root 369400 Jun 21 02:06 hello_cargo/target/release/hello_cargo

ls -l fib
-rwxrwxrwx 1 root root 16168 Jun 21 01:21 fib

strip fib
ls -l fib
-rwxrwxrwx 1 root root 14496 Jun 21 02:08 fib