【发布时间】:2021-03-29 17:28:43
【问题描述】:
我有许多 4KiB 缓冲区,它们有 50% 的机会只包含零值。非零缓冲区通常在缓冲区的早期有一个非零字节。
fn is_zero(buf: &Vec<u8>) -> bool {
for byte in buf.into_iter() {
if *byte != 0 {
return false;
}
}
return true;
}
这是使用--release 签入 Rust 的一种高效方式吗? (我正在处理许多 GB 的数据。)
(在 C 版本中,我在检查之前将缓冲区转换为 unsigned long long。考虑到 SSE 等,这可能不是我能做的最好的)
【问题讨论】:
-
与性能没有直接关系,但您应该做的一件事是将参数更改为
&[u8]以避免双重间接(如果没有首先优化)。见Why is it discouraged to accept a reference to a String (&String), Vec (&Vec), or Box (&Box) as a function argument?。并删除多余的.into_iter。 -
您可以将其写为
buf.into_iter().all(|&b| b == 0),这很清楚(恕我直言),它首先不需要单独的函数。在发布模式下,性能应该与手动循环相当。 -
很遗憾没有
memchr的负匹配变体。