Criterion para Rust: guía completa con ejemplos prácticos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Biblioteca Criterion para Rust: benchmarking estadístico

En el mundo de la programación de sistemas, el rendimiento no es solo un deseo, sino a menudo un requisito estricto. Rust, al ser un lenguaje que otorga al desarrollador control sobre la memoria y el tiempo de ejecución, necesita herramientas capaces de medir ese control con precisión. Aquí entra en escena Criterion, una biblioteca para benchmarking estadístico que transforma la medición del rendimiento de un simple "cronómetro" en un experimento científico.

¿Por qué es necesaria esta biblioteca? El benchmarking estándar en Rust (a través de #[bench]) es útil, pero tiene una limitación fundamental: no considera la dispersión estadística. Los procesadores modernos tienen arquitecturas complejas con cachés, predictores de saltos y turbo boost. Un mismo código puede ejecutarse en tiempos diferentes dependiendo del "ruido" del sistema operativo, la temperatura de la CPU o el estado aleatorio de la caché. Criterion resuelve este problema ejecutando cada prueba múltiples veces, recopilando una muestra de tiempos de ejecución y aplicando métodos estadísticos (media, mediana, desviación estándar, percentiles). El resultado no es solo un "tiempo en microsegundos", sino un intervalo de confianza que indica: "Con un 95% de probabilidad, el tiempo real de ejecución está entre X e Y".

Además, Criterion ofrece potentes herramientas para análisis de regresión. Puedes comparar el rendimiento de dos versiones de tu código (por ejemplo, antes y después de una optimización) y obtener una respuesta estadísticamente significativa a la pregunta: "¿La nueva versión es más rápida, o la diferencia está dentro del margen de error?". La biblioteca genera informes HTML atractivos con gráficos, histogramas y tablas, haciendo que el análisis de rendimiento sea visual y convincente. Es una herramienta indispensable para desarrolladores de bibliotecas, motores de juegos, bases de datos, algoritmos criptográficos y cualquier otro código donde cada nanosegundo cuenta.

Instalación

La instalación de Criterion en un proyecto Rust se realiza a través del gestor de paquetes cargo. Debes agregar la dependencia en el archivo Cargo.toml de tu proyecto. Se recomienda añadirla como dependencia de desarrollo, ya que los benchmarks no forman parte de la aplicación final.

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

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

Explicación:

  • version = "0.5" — especifica la versión de la biblioteca. Al momento de escribir esta guía, la versión actual es 0.5.x.
  • features = ["html_reports"] — habilita la generación de informes HTML con gráficos. Es una función opcional pero muy útil.
  • [[bench]] — sección que le indica a Cargo que tenemos un benchmark llamado my_benchmark.
  • harness = false — desactiva el ejecutor de benchmarks integrado de Cargo. Esto es necesario para que Criterion tome el control.

Después de esto, crea el archivo benches/my_benchmark.rs (la ruta debe coincidir con el nombre especificado en [[bench]]).

Inicio rápido: ejemplo mínimo funcional

Escribamos un benchmark simple que mida la velocidad de cálculo de la suma de números del 1 al 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 evita que el compilador optimice el código
    c.bench_function("sum 1000", |b| b.iter(|| sum_up_to(black_box(1000))));
}

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

Cómo ejecutarlo:

cargo bench

Después de la ejecución, en la consola verás algo similar a:

Recommendations