为什么Rust文档说阵列上的while循环比for循环慢?

为什么Rust文档说阵列上的while循环比for循环慢?,rust,Rust,在阅读rust文档时,我偶然发现使用while循环(带索引)迭代数组a: 我就是不知道该怎么办。Rust编译器是否有某种行为?这两部分是互补的: 如果索引长度不正确,可能会导致程序死机 每次编写某个切片[某个索引],标准库都会执行以下等效操作: if some_index < some_slice.len() { some_slice.get_the_value_without_checks(some_index) } else { panic!("Hey, stop th

在阅读rust文档时,我偶然发现使用while循环(带索引)迭代数组
a


我就是不知道该怎么办。Rust编译器是否有某种行为?

这两部分是互补的:

如果索引长度不正确,可能会导致程序死机

每次编写
某个切片[某个索引]
,标准库都会执行以下等效操作:

if some_index < some_slice.len() {
    some_slice.get_the_value_without_checks(some_index)
} else {
    panic!("Hey, stop that");
}
另见:


1-作为:


应该注意,优化器可能(也可能不)能够在
while
情况下删除边界检查。如果成功了,那么性能相当;如果失败,代码会突然变慢。在微基准中,通过简单的代码,改变是可以成功的。。。但这可能不会携带到您的生产代码中,也可能现在携带,循环体中的下一个更改将阻止优化,等等。。。简而言之,
while
循环可能是一个性能定时炸弹

另见:


您的问题到底是什么?请检查
是否等同于
部分思考操作
a[index]
对于任意切片
a
。程序必须做些什么来确保读取
索引位置的元素是安全的?现在再读一遍那一段。这句话一针见血!非常感谢。应该注意,优化器可能(也可能不)能够在
while
情况下删除边界检查。如果成功了,那么性能相当;如果失败,代码会突然变慢。在微基准中,通过简单的代码,改变是可以成功的。。。但这可能不会携带到您的生产代码中,也可能现在携带,循环体中的下一个更改将阻止优化,等等。。。简而言之,
while
循环可能是一个性能定时炸弹。
fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a.iter() {
        println!("the value is: {}", element);
    }
}
if some_index < some_slice.len() {
    some_slice.get_the_value_without_checks(some_index)
} else {
    panic!("Hey, stop that");
}
while some_index < limit {
    if some_index < some_slice.len() {
        some_slice.get_the_value_without_checks(some_index)
    } else {
        panic!("Hey, stop that");
    }
    some_index += 1;
}
while some_index < limit {
    some_slice.get_the_value_without_checks(some_index)
    some_index += 1;
}