在Rust中统计布尔值为true的数量有没有简便方法?
布尔值true数量统计的优化方案
你给出的示例为Rust语法,先针对Rust场景给出最优实现,再补充跨语言通用思路。
Rust 场景实现
写法1:直接相加(3个及以下布尔值最优)
利用Rust中bool类型强制转换为整数时true对应1、false对应0的特性,直接求和即可,完全无分支,编译后指令效率最高:
let count = a as u8 + b as u8 + c as u8;
写法2:迭代器统计(扩展性最优)
如果布尔值数量较多,或者后续可能新增变量,可以用数组加迭代器的写法,新增布尔值仅需要修改数组元素即可,不需要调整逻辑:
let count = [a, b, c].into_iter().filter(|&val| val).count() as u8;
该写法在release编译下会被自动优化为和直接相加几乎一致的机器码,性能损失可以忽略。
跨语言通用思路
几乎所有主流语言的布尔值都有对应0/1的底层映射,不需要分支判断即可统计,比你原本的if累加写法避免了分支预测失败的开销,性能普遍高10%~30%,循环调用时差异更明显:
- C/C++:
int count = a + b + c;(C/C++中bool本质是0/1整数类型) - Python:
count = sum([a, b, c])(Python中True等价1,False等价0) - Java:
int count = (a? 1 : 0) + (b? 1 : 0) + (c? 1 : 0);
内容的提问来源于stack exchange,提问作者Elie Hess。
相关产品推荐
相关产品推荐

