You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中合并已知大小切片为数据库键:为何Vec实现更快?

问题

我需要拼接三个部分生成数据库键:

  • 一个前缀字节(u8)
  • 编译期已知大小(20字节)的输入切片
  • 编译期已知大小(32字节)的输入切片

我测试了以下三个Rust函数,原本以为无需内存分配的slot_key_array会是最快的,但实际测试中预分配容量的slot_key_sized始终更快,想知道原因:

#[inline]
pub fn slot_key_vec(address: &[u8], slot: &[u8]) -> Vec<u8> {
  let mut key: Vec<u8> = vec![DB_PREFIX_SLOT];
  key.extend_from_slice(address);
  key.extend_from_slice(slot);
  key
}

#[inline]
pub fn slot_key_sized(address: &[u8], slot: &[u8]) -> Vec<u8> {
  let mut key: Vec<u8> = Vec::with_capacity(1 + 20 + 32);
  key.push(DB_PREFIX_SLOT);
  key.extend_from_slice(address);
  key.extend_from_slice(slot);
  key
}

#[inline]
pub fn slot_key_array(address: &[u8], slot: &[u8]) -> [u8; 53] {
  let key: [u8; 53] = [
    DB_PREFIX_SLOT,
    address[0], address[1], address[2], address[3], address[4], address[5], address[6], address[7],
    address[8], address[9], address[10], address[11], address[12], address[13], address[14], address[15],
    address[16], address[17], address[18], address[19],
    slot[0], slot[1], slot[2], slot[3], slot[4], slot[5], slot[6], slot[7],
    slot[8], slot[9], slot[10], slot[11], slot[12], slot[13], slot[14], slot[15],
    slot[16], slot[17], slot[18], slot[19], slot[20], slot[21], slot[22], slot[23],
    slot[24], slot[25], slot[26], slot[27], slot[28], slot[29], slot[30], slot[31],
  ];
  key
}
分析与解答

1. 数组初始化的低效内存操作

slot_key_array通过逐个索引访问address和slot的元素来初始化数组,这种写法会生成大量独立的内存读取指令。而slot_key_sized里的extend_from_slice调用的是底层批量内存拷贝(比如memcpy),CPU能对批量拷贝做SIMD指令、缓存预取等高效优化,速度远快于逐个元素读取赋值。

2. 返回值的内存拷贝开销

slot_key_array返回固定大小数组时,在多数调用场景下,数组需要从函数栈帧完整拷贝到调用者的内存区域。而Vec的返回是移动语义,本质上只需要拷贝几个字节的元数据(指针、长度、容量),底层堆内存完全不需要拷贝。如果调用者后续还要把数组转成Vec,还会多一次额外拷贝,进一步拉大性能差距。

3. 编译器优化的局限性

虽然Rust编译器会做大量优化,但手动逐个元素初始化数组的写法,编译器很难完全优化成批量拷贝。而Vec的extend_from_slice是标准库中高度优化的代码,编译器能直接识别并调用最优的内存拷贝实现,甚至在编译期就展开成更高效的指令序列。

4. 缓存行为差异

逐个读取数组元素会导致更多的缓存命中延迟,而批量拷贝是连续内存访问,更符合CPU的缓存预取机制,能充分利用缓存带宽,减少内存等待时间。

内容的提问来源于stack exchange,提问作者theflash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:05:58