Skip to content

性能基准

本文档提供 Rust 和 Go 实现的详细性能基准数据。

测试环境

项目规格
OSUbuntu 22.04 LTS
CPUAMD Ryzen 9 5900X (12核/24线程)
RAM64GB DDR4-3200
StorageSamsung 980 Pro NVMe SSD
Rust1.75.0
Go1.22.0

dos2unix 基准

吞吐量测试

测试文件:100% CRLF 文本文件

文件大小RustGo系统 dos2unix
1 KB12 MB/s8 MB/s15 MB/s
1 MB850 MB/s720 MB/s580 MB/s
10 MB920 MB/s780 MB/s610 MB/s
100 MB940 MB/s795 MB/s625 MB/s
1 GB945 MB/s800 MB/s630 MB/s

内存占用

启动时间

实现冷启动热启动
Rust2.1 ms1.8 ms
Go4.5 ms3.2 ms
系统1.2 ms0.8 ms

gzip 基准

压缩性能

测试文件:文本文件 (repetitive patterns)

压缩级别Rust (flate2)Go (compress/gzip)系统 gzip
-1 (fast)180 MB/s140 MB/s250 MB/s
-6 (default)150 MB/s120 MB/s200 MB/s
-9 (best)45 MB/s35 MB/s60 MB/s

解压性能

实现速度内存
Rust420 MB/s8 MB
Go350 MB/s12 MB
系统480 MB/s5 MB

压缩比

注:三种实现使用相同的 DEFLATE 算法,压缩比一致。

htop 基准

启动时间

平台RustGo系统 htop
Linux15 ms28 ms10 ms
macOS22 ms38 ms18 ms
Windows35 ms52 msN/A

刷新延迟

测试条件:1000 个进程

操作RustGo
进程列表刷新2.1 ms4.3 ms
CPU 计算刷新1.8 ms3.5 ms
内存计算刷新0.5 ms1.2 ms
UI 渲染0.8 ms1.5 ms
总计5.2 ms10.5 ms

内存占用

CPU 占用

场景RustGo
空闲 (1s 刷新)0.3%0.5%
快速刷新 (100ms)2.1%3.8%
搜索过滤5.2%8.5%

二进制大小

Release 构建 (stripped)

工具RustGo
dos2unix350 KB1.2 MB
gzip800 KB1.8 MB
htop1.5 MB3.2 MB

构建选项影响

并发基准

任务创建 (100万任务)

实现时间内存
Rust (tokio::spawn)120 ms50 MB
Go (goroutine)65 ms200 MB

Channel 吞吐

实现无缓冲缓冲 (1000)
Rust (tokio::sync::mpsc)2.5 M/s8 M/s
Go (chan)1.8 M/s6 M/s

锁竞争

实现MutexRwLock (读多)
Rust80 ns/op30 ns/op
Go120 ns/opN/A (RWMutex: 50 ns/op)

综合评分

评分标准

  • 吞吐量 (40%)
  • 内存效率 (30%)
  • 启动时间 (20%)
  • 二进制大小 (10%)

基准测试代码

Rust (criterion)

rust
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};

fn dos2unix_benchmark(c: &mut Criterion) {
    let data = generate_crlf_text(1024 * 1024); // 1MB
    
    let mut group = c.benchmark_group("dos2unix");
    group.throughput(Throughput::Bytes(data.len() as u64));
    
    group.bench_function("rust", |b| {
        b.iter(|| dos2unix::convert(black_box(&data)))
    });
    
    group.finish();
}

criterion_group!(benches, dos2unix_benchmark);
criterion_main!(benches);

Go (testing)

go
func BenchmarkDos2Unix(b *testing.B) {
    data := generateCRLFText(1024 * 1024) // 1MB
    
    b.SetBytes(int64(len(data)))
    b.ResetTimer()
    
    for i := 0; i < b.N; i++ {
        dos2unix.Convert(data)
    }
}

// 运行: go test -bench=. -benchmem

相关文档