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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:57:10