2017-07-23 6 views
4

Die zweite Ausgabe von Die Rust-Programmiersprachestates the following über While-Schleifen für über ein Array iterieren:Warum wird die Leistung von `while` bei der Iteration über ein Array langsamer als` for`?

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; 
    } 
} 

[...] Es ist auch langsam, weil der Compiler Laufzeitcode fügt die Bedingung erfüllen Überprüfen Sie jedes Element bei jeder Iteration durch die Schleife.

Als eine effizientere Alternative können Sie eine for-Schleife verwenden und Code für jedes Element in einer Auflistung ausführen.

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

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

In C++ Ich würde erwarten, dass ein Compiler/Optimierer etwas mit dem entsprechenden Laufzeitleistung zu erzeugen.

Warum ist das in Rust nicht der Fall?

Antwort

10

In C++ würde ich erwarten, dass ein Compiler/Optimierer etwas mit äquivalenter Laufzeitleistung produziert.

Da die beiden Schnipsel sind nicht gleichwertig. Die Verwendung von a[i] in Rust Karten zu a.at(i) und die Verwendung von unsafe { a.get_unchecked(i) } in Rust Karten zu a[i] in C++.

Das heißt, C++ tut nicht Grenzen Prüfung standardmäßig durchführen, das ist, wie Sie Puffer erhalten überläuft.

Warum ist das in Rust nicht der Fall?

Rust, wenn nicht das unsafe Schlüsselwort verwenden, sollten Speicher sicher sein. In vielen Situationen wird dies durch Compile-Time-Prüfungen erreicht, aber die Überprüfung von Grenzen erfordert im Allgemeinen Laufzeitprüfungen. Das bedeutet

nicht, dass der while Fall immer langsamer sein wird: es bedeutet nur, dass Sie sich den Launen des Optimierers einreichen, und manchmal es lässt Sie nach unten (Grenzen Kontrollen zu beseitigen ist ein hartes Problem).

Daher empfiehlt es sich, Idiome zu verwenden, die bekanntermaßen gut zu optimieren sind.

Verwandte Themen