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

Tob*_*ann 5 performance rust

第二版The Rust Programming Language 声明了以下关于迭代数组的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    for element in a.iter() {
        println!("the value is: {}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

为什么Rust不是这样的?

Mat*_* M. 11

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

因为这两个片段相同.使用a[i]Rust映射到Rust映射到C++中a.at(i)的用法.unsafe { a.get_unchecked(i) }a[i]

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

为什么Rust不是这样的?

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

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

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