Criterion für Rust: Vollständiges Tutorial mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Criterion-Bibliothek für Rust: Statistisches Benchmarking

In der Welt der Systemprogrammierung ist Performance nicht nur ein Wunsch, sondern oft eine harte Anforderung. Rust, eine Sprache, die dem Entwickler Kontrolle über Speicher und Ausführungszeit gibt, benötigt Werkzeuge, die diese Kontrolle präzise messen können. Hier kommt Criterion ins Spiel – eine Bibliothek für statistisches Benchmarking, die den Prozess der Leistungsmessung von einer groben "Stoppuhr" in ein wissenschaftliches Experiment verwandelt.

Warum ist diese Bibliothek notwendig? Das standardmäßige Benchmarking in Rust (über #[bench]) ist nützlich, hat aber einen grundlegenden Nachteil: Es berücksichtigt keine statistischen Schwankungen. Moderne Prozessoren haben eine komplexe Architektur mit Caches, Sprungvorhersagen und Turbo-Boost. Derselbe Code kann je nach "Rauschen" des Betriebssystems, CPU-Temperatur oder zufälligem Cache-Zustand unterschiedlich lange ausgeführt werden. Criterion löst dieses Problem, indem es jeden Test mehrfach ausführt, eine Stichprobe der Ausführungszeiten sammelt und statistische Methoden (Mittelwert, Median, Standardabweichung, Perzentile) anwendet. Das Ergebnis ist nicht nur eine "Zeit in Mikrosekunden", sondern ein Konfidenzintervall, das aussagt: "Mit 95%iger Wahrscheinlichkeit liegt die wahre Ausführungszeit im Bereich von X bis Y".

Darüber hinaus bietet Criterion leistungsstarke Werkzeuge für die Regressionsanalyse. Sie können die Performance zweier Versionen Ihres Codes vergleichen (z. B. vor und nach einer Optimierung) und eine statistisch signifikante Antwort auf die Frage erhalten: "Ist die neue Version schneller, oder liegt der Unterschied innerhalb der Fehlertoleranz?". Die Bibliothek generiert ansprechende HTML-Berichte mit Diagrammen, Histogrammen und Tabellen, die die Leistungsanalyse anschaulich und überzeugend machen. Dies ist ein unverzichtbares Werkzeug für Entwickler von Bibliotheken, Spiele-Engines, Datenbanken, kryptografischen Algorithmen und jedem anderen Code, bei dem jede Nanosekunde zählt.

Installation

Die Installation von Criterion in ein Rust-Projekt erfolgt über den Paketmanager cargo. Sie müssen die Abhängigkeit in Ihrer Cargo.toml-Datei hinzufügen. Es wird empfohlen, sie als dev-Abhängigkeit hinzuzufügen, da Benchmarks nicht Teil der endgültigen Anwendung sind.

[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }

[[bench]]
name = "my_benchmark"
harness = false

Erklärung:

  • version = "0.5" – gibt die Version der Bibliothek an. Zum Zeitpunkt der Erstellung dieses Artikels ist Version 0.5.x aktuell.
  • features = ["html_reports"] – aktiviert die Generierung von HTML-Berichten mit Diagrammen. Dies ist eine optionale, aber sehr nützliche Funktion.
  • [[bench]] – dieser Abschnitt teilt Cargo mit, dass wir einen Benchmark namens my_benchmark haben.
  • harness = false – deaktiviert den integrierten Benchmark-Runner von Cargo. Dies ist notwendig, damit Criterion die Kontrolle übernehmen kann.

Erstellen Sie anschließend die Datei benches/my_benchmark.rs (der Pfad muss mit dem in [[bench]] angegebenen Namen übereinstimmen).

Schnellstart: Minimales Arbeitsbeispiel

Schreiben wir einen einfachen Benchmark, der die Geschwindigkeit der Summenberechnung von Zahlen von 1 bis 1000 misst.

// benches/my_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};

fn sum_up_to(n: u64) -> u64 {
    let mut sum = 0;
    for i in 1..=n {
        sum += i;
    }
    sum
}

fn bench_sum(c: &mut Criterion) {
    // black_box verhindert Compiler-Optimierungen
    c.bench_function("sum 1000", |b| b.iter(|| sum_up_to(black_box(1000))));
}

criterion_group!(benches, bench_sum);
criterion_main!(benches);

So starten Sie den Benchmark:

cargo bench

Nach der Ausführung sehen Sie in der Konsole etwa Folgendes:

Empfehlungen