Criterion pour Rust : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

La bibliothèque Criterion pour Rust : benchmarking statistique

Dans le monde de la programmation système, la performance n'est pas un simple souhait, mais souvent une exigence stricte. Rust, en tant que langage offrant au développeur un contrôle sur la mémoire et le temps d'exécution, nécessite des outils capables de mesurer précisément ce contrôle. C'est là qu'intervient Criterion — une bibliothèque de benchmarking statistique qui transforme la mesure des performances d'un simple "chronomètre" en une véritable expérience scientifique.

Pourquoi cette bibliothèque est-elle indispensable ? Le benchmarking standard en Rust (via #[bench]) est utile, mais il présente un défaut fondamental : il ne prend pas en compte la dispersion statistique. Les processeurs modernes ont une architecture complexe avec des caches, des prédicteurs de branchement et le turbo boost. Un même code peut s'exécuter en des temps différents selon le "bruit" du système d'exploitation, la température du CPU ou l'état aléatoire du cache. Criterion résout ce problème en exécutant chaque test de nombreuses fois, en collectant un échantillon de temps d'exécution et en lui appliquant des méthodes statistiques (moyenne, médiane, écart type, percentiles). Le résultat n'est pas simplement un "temps en microsecondes", mais un intervalle de confiance qui indique : "Avec une probabilité de 95 %, le vrai temps d'exécution se situe entre X et Y".

De plus, Criterion offre des outils puissants pour l'analyse de régression. Vous pouvez comparer les performances de deux versions de votre code (par exemple, avant et après une optimisation) et obtenir une réponse statistiquement significative à la question : "La nouvelle version est-elle plus rapide, ou la différence est-elle dans la marge d'erreur ?". La bibliothèque génère de magnifiques rapports HTML avec des graphiques, des histogrammes et des tableaux, rendant l'analyse des performances claire et convaincante. C'est un outil indispensable pour les développeurs de bibliothèques, de moteurs de jeux, de bases de données, d'algorithmes cryptographiques et de tout code où chaque nanoseconde compte.

Installation

L'installation de Criterion dans un projet Rust se fait via le gestionnaire de paquets cargo. Vous devez ajouter la dépendance dans le fichier Cargo.toml de votre projet. Il est recommandé de l'ajouter en tant que dépendance de développement, car les benchmarks ne font pas partie de l'application finale.

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

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

Explication :

  • version = "0.5" — spécifie la version de la bibliothèque. Au moment de la rédaction de cet article, la version 0.5.x est la plus récente.
  • features = ["html_reports"] — active la génération de rapports HTML avec des graphiques. C'est une fonctionnalité optionnelle mais très utile.
  • [[bench]] — section qui indique à Cargo que nous avons un benchmark nommé my_benchmark.
  • harness = false — désactive l'exécuteur de benchmark intégré de Cargo. Cela est nécessaire pour que Criterion puisse prendre le contrôle.

Ensuite, créez un fichier benches/my_benchmark.rs (le chemin doit correspondre au nom spécifié dans [[bench]]).

Démarrage rapide : exemple minimal fonctionnel

Écrivons un benchmark très simple qui mesure la vitesse de calcul de la somme des nombres de 1 à 1000.

// 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 empêche l'optimisation du compilateur
    c.bench_function("sum 1000", |b| b.iter(|| sum_up_to(black_box(1000))));
}

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

Comment exécuter :

cargo bench

Après l'exécution, vous verrez dans la console quelque chose comme :

Recommendations