为什么在迭代数组时,`while`的性能比`for`慢?

时间:2017-07-23 11:33:05

标签: performance rust

第二版 The Rust Programming Language states the following关于迭代数组的while循环:

fn main() {
    let a = [10, 20, 30, 40, 50];
    let mut index = 0;

    while index < 5 {
        println!("the value is: {}", a[index]);

        index = index + 1;
    }
}
  

[...]它也很慢,因为编译器添加运行时代码来对循环中每次迭代的每个元素执行条件检查。

     

作为一种更有效的替代方法,您可以使用for循环并为集合中的每个项执行一些代码。

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a.iter() {
        println!("the value is: {}", element);
    }
}

在C ++中,我希望编译器/优化器能够生成具有相同运行时性能的东西。

为什么Rust不是这种情况?

1 个答案:

答案 0 :(得分:11)

  

在C ++中,我希望编译器/优化器能够生成具有相同运行时性能的东西。

因为两个片段的不等同于。在Rust中使用a[i]映射到a.at(i)并在Rust中使用unsafe { a.get_unchecked(i) }映射到C ++中的a[i]

也就是说,C ++默认情况下执行边界检查,这就是缓冲区溢出的方式。

  

为什么Rust不是这种情况?

Rust,当不使用unsafe关键字时,应该是内存安全的。在许多情况下,这是通过编译时检查实现的,但边界检查通常需要运行时检查。

这并不意味着while的情况总是会慢一点:它只是意味着你提交给优化器的一时兴起,有时它让你失望(消除边界检查是一个难题)

因此,建议使用已知可以很好地优化的习语。