先明确目标

“零拷贝”不是为了炫技,而是为了减少:

  • 内存分配次数
  • 数据复制成本
  • GC 或 allocator 压力

在高吞吐场景里,收益通常很直接。

借用驱动的数据视图

Rust 的借用模型天然适合做零拷贝读取:

#[derive(Debug)]
struct Header<'a> {
    trace_id: &'a str,
    method: &'a str,
}

fn parse_header<'a>(trace_id: &'a str, method: &'a str) -> Header<'a> {
    Header { trace_id, method }
}

这里没有分配新字符串,只是借用了输入切片。

适用边界

适合:

  • 协议解析
  • 日志处理
  • 消息中间件消费链路

不适合:

  • 需要长期持有数据跨线程传递
  • 接口边界复杂,生命周期管理成本过高

工程上的折中

  • 热路径零拷贝
  • 冷路径允许复制换可读性
  • 用基准测试验证收益,而不是主观判断

小结

零拷贝是性能工具,不是教条。只有在瓶颈路径上,它才是值得支付复杂度的优化。