gpt4 book ai didi

performance - 为什么在遍历数组时 `while` 的性能据说比 `for` 慢?

转载 作者:行者123 更新时间:2023-11-29 07:49:23 26 4
gpt4 key购买 nike

Rust 编程语言第二版 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;
}
}

[...] It’s also slow, because the compiler adds runtime code to perform the conditional check on every element on every iteration through the loop.

As a more efficient alternative, you can use a for loop and execute some code for each item in a collection.

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

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

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

为什么在 Rust 中不是这种情况?

最佳答案

In C++ I would expect a compiler/optimizer to produce something with equivalent run-time performance.

因为这两个片段是等价的。 a[i] 在 Rust 中的使用映射到 a.at(i)unsafe { a.get_unchecked(i) } 的使用> 在 Rust 中映射到 C++ 中的 a[i]

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

Why is this not the case in Rust?

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

这并不意味着 while 的情况总是会变慢:它只是意味着您将自己提交给优化器的突发奇想,有时它会让您失望(消除边界检查是一种难题)。

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

关于performance - 为什么在遍历数组时 `while` 的性能据说比 `for` 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45264588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com