首先下载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