当在Rust中的一个数组上运行求和循环时,我发现CAPACITY> = 240 时性能会大幅下降。CAPACITY= 239的速度大约是80倍。
Rust对“短”数组进行了特殊的编译优化吗?
与编译rustc -C opt-level=3。
use std::time::Instant;
const CAPACITY: usize = 240; const IN_LOOPS: usize = 500000;
fn main() { let mut arr = [0; CAPACITY]; for i in 0..CAPACITY { arr[i] = i; } let mut sum = 0; let now = Instant::now(); for _ in 0..IN_LOOPS { let mut s = 0; for i in 0..arr.len() { s += arr[i]; } sum += s; } println!("sum:{} time:{:?}", sum, now.elapsed()); }
如果您想使用迭代器,请尝试以下操作:
const CAPACITY: usize = 240; const IN_LOOPS: usize = 500000;
pub fn bar() -> usize { (0..CAPACITY).sum:: () * IN_LOOPS } 感谢@Chris Morgan提供有关范围模式的建议。
该优化的装配是相当不错的:
example::bar: movabs rax, 14340000000 ret 问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。