Rust性能关键内循环:小缓冲区与整数互转的高效实现问询
Rust性能关键内循环:小端序缓冲区与整数的高效转换
问题背景
我需要在性能关键的内循环中完成小缓冲区与整数的相互转换,目标是实现最高效的小端序(Little-Endian)处理——多数CPU支持通过单次加载加掩码操作完成这类转换。以下是我初步实现的几个函数,想找到Rust中无需依赖unsafe的最优实现方案:
#[inline(always)] fn unpack16(x: u64, y: u64) -> [u8; 16] { let x = x.to_le_bytes(); let y = y.to_le_bytes(); [ x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7] ] } #[inline(always)] fn pack16(b: [u8; 16]) -> (u64, u64) { let x = u64::from_le_bytes([b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]]); let y = u64::from_le_bytes([b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]]); (x, y) } #[inline(always)] fn unpack12(x: u64, y: u64) -> [u8; 12] { let x = x.to_le_bytes(); let y = y.to_le_bytes(); [ x[0], x[1], x[2], x[3], x[4], x[5], y[0], y[1], y[2], y[3], y[4], y[5], ] } #[inline(always)] fn pack12(b: [u8; 12]) -> (u64, u64) { let x = u64::from_le_bytes([b[0], b[1], b[2], b[3], b[4], b[5], 0, 0]); let y = u64::from_le_bytes([b[6], b[7], b[8], b[9], b[10], b[11], 0, 0]); (x, y) }
虽然可以通过获取数组原始地址、用unsafe代码直接加载u64来实现,但我更倾向于寻找不依赖unsafe的高效方案。
优化发现:unpack12的更简洁实现
在Compiler Explorer中做了大量测试后,我发现以下unpack12实现生成的汇编代码和手写版本完全一致,且代码更简洁:
fn unpack12(x: u64, y: u64) -> [u8; 12] { let combined = (x as u128) | ((y as u128) << 48); combined.to_le_bytes()[..12].try_into().unwrap() }
内容的提问来源于stack exchange,提问作者eof
相关产品推荐
相关产品推荐

