Rust性能测量库measured的使用,measured提供高效精准的代码执行时间分析与性能监控工具

Rust性能测量库measured的使用

measured是一个高效的Rust指标库,提供精准的代码执行时间分析和性能监控工具。以下是它的主要特性和使用示例。

性能基准测试

计数器性能

在不同硬件平台上,measured表现出优异的性能:

Linux Ryzen 9 7950x (32线程)

measured           60.55 ns      │ 190.3 ns      │ 147.5 ns      │ 149.2 ns
measured_sparse    380.4 ns      │ 538.5 ns      │ 497.9 ns      │ 495.6 ns

Macbook Pro M2 Max (12线程)

measured           79.55 ns      │ 243.9 ns      │ 154.7 ns      │ 154.7 ns
measured_sparse    396.3 ns      │ 551.6 ns      │ 488.4 ns      │ 486.6 ns

直方图性能

测量代码执行时间分布:

Linux Ryzen 9 7950x (32线程)

fixed_cardinality
  measured           212.4 ns      │ 402.9 ns      │ 346.6 ns      │ 342.5 ns
no_cardinality
  measured           2.8 µs        │ 3.532 µs      │ 3.331 µs      │ 3.264 µs

使用示例

基本计数器使用

use measured::{metric, Counter, MetricGroup};

#[metric]
struct MyMetrics {
    requests: Counter,
    errors: Counter,
}

fn main() {
    let metrics = MyMetrics::default();
    
    // 增加计数器
    metrics.requests.increment();
    metrics.errors.increment_by(3);
    
    // 获取当前值
    println!("Requests: {}", metrics.requests.value());
}

带标签的度量

use measured::{metric, Counter, MetricGroup};

#[metric]
struct MyMetrics {
    #[metric(labels = ["method", "status"])]
    http_requests: Counter,
}

fn main() {
    let metrics = MyMetrics::default();
    
    // 带标签的计数器
    metrics.http_requests.with_label_values(&["GET", "200"]).increment();
    metrics.http_requests.with_label_values(&["POST", "404"]).increment();
}

直方图测量执行时间

use measured::{metric, Histogram, MetricGroup};
use std::time::Instant;

#[metric]
struct MyMetrics {
    #[metric(buckets = [0.1, 0.5, 1.0, 2.5, 5.0, 10.0])]
    response_times: Histogram,
}

fn process_request() {
    // 模拟处理请求
    std::thread::sleep(std::time::Duration::from_millis(100));
}

fn main() {
    let metrics = MyMetrics::default();
    
    let start = Instant::now();
    process_request();
    let duration = start.elapsed();
    
    // 记录响应时间
    metrics.response_times.record(duration.as_secs_f64());
}

完整示例

use measured::{metric, Counter, Histogram, MetricGroup};
use std::time::Instant;

#[metric]
struct WebMetrics {
    #[metric(labels = ["method", "status"])]
    http_requests: Counter,
    
    #[metric(buckets = [0.1, 0.5, 1.0, 2.5, 5.0, 10.0])]
    response_times: Histogram,
    
    errors: Counter,
}

fn handle_request(method: &str) -> Result<(), &'static str> {
    let start = Instant::now();
    
    // 模拟处理请求
    std::thread::sleep(std::time::Duration::from_millis(
        rand::random::<u64>() % 500 + 100 // 100-600ms
    ));
    
    // 随机返回成功或错误
    if rand::random::<f32>() > 0.9 {
        Err("server error")
    } else {
        Ok(())
    }
}

fn main() {
    let metrics = WebMetrics::default();
    
    for _ in 0..100 {
        let method = if rand::random::<bool>() { "GET" } else { "POST" };
        let result = handle_request(method);
        
        let status = match result {
            Ok(_) => "200",
            Err(_) => "500",
        };
        
        metrics.http_requests.with_label_values(&[method, status]).increment();
        
        if result.is_err() {
            metrics.errors.increment();
        }
    }
    
    println!("Total requests: {}", metrics.http_requests.value());
    println!("Total errors: {}", metrics.errors.value());
    println!("Response times: {:?}", metrics.response_times.buckets());
}

这个示例展示了如何:

  1. 定义带有标签的计数器
  2. 测量并记录响应时间
  3. 跟踪错误数量
  4. 使用直方图分析响应时间分布

measured库在内存使用和性能方面都表现出色,特别适合需要高性能指标收集的应用程序。


1 回复

Rust性能测量库measured的使用指南

measured是一个高效的Rust性能测量库,专门用于代码执行时间分析和性能监控。它提供了精确的测量工具,帮助开发者优化代码性能。

主要特性

  • 高精度计时(纳秒级)
  • 低开销测量
  • 线程安全的统计收集
  • 灵活的测量范围
  • 丰富的统计指标(平均值、百分位数等)

安装

Cargo.toml中添加依赖:

[dependencies]
measured = "0.5"

基本使用方法

简单计时

use measured::measure;

fn expensive_operation() {
    // 模拟耗时操作
    std::thread::sleep(std::time::Duration::from_millis(100));
}

fn main() {
    let (result, duration) = measure(|| {
        expensive_operation();
        42 // 返回结果
    });
    
    println!("操作结果: {}, 耗时: {:?}", result, duration);
}

使用Metric和Collector进行详细统计

use measured::{Metric, Collector, metric::Duration};

fn main() {
    // 创建一个收集器
    let collector = Collector::new();
    
    // 创建一个指标
    let metric = Metric::new("api_request_time");
    
    for _ in 0..100 {
        // 测量代码块
        let _guard = collector.measure(metric);
        
        // 模拟API请求
        std::thread::sleep(std::time::Duration::from_millis(rand::random::<u64>() % 50));
    }
    
    // 获取统计信息
    let stats = collector.get(metric).unwrap();
    
    println!("API请求时间统计:");
    println!("  调用次数: {}", stats.count());
    println!("  平均时间: {:?}", stats.mean());
    println!("  最小时间: {:?}", stats.min());
    println!("  最大时间: {:?}", stats.max());
    println!("  99百分位: {:?}", stats.percentile(0.99));
}

多线程测量

use measured::{Collector, Metric};
use std::sync::Arc;
use std::thread;

fn worker(collector: Arc<Collector>, metric: Metric, id: usize) {
    for _ in 0..50 {
        let _guard = collector.measure(metric);
        // 模拟工作负载
        thread::sleep(std::time::Duration::from_micros(
            (100 + id * 10) as u64
        ));
    }
}

fn main() {
    let collector = Arc::new(Collector::new());
    let metric = Metric::new("thread_work_time");
    
    let mut handles = vec![];
    
    for i in 0..4 {
        let collector = collector.clone();
        let metric = metric.clone();
        
        handles.push(thread::spawn(move || {
            worker(collector, metric, i);
        }));
    }
    
    for handle in handles {
        handle.join().unwrap();
    }
    
    let stats = collector.get(metric).unwrap();
    println!("多线程工作统计: {:?}", stats);
}

高级功能

自定义标签

use measured::{Collector, Metric, LabelGroup};

fn main() {
    let collector = Collector::new();
    let labels = LabelGroup::new("endpoint")
        .with_label("users")
        .with_label("products");
    
    let metric = Metric::new("http_request_time").with_labels(labels);
    
    // 测量不同端点的请求时间
    let _guard1 = collector.measure(metric.with_label_value("users"));
    // 模拟/users端点请求
    std::thread::sleep(std::time::Duration::from_millis(120));
    
    let _guard2 = collector.measure(metric.with_label_value("products"));
    // 模拟/products端点请求
    std::thread::sleep(std::time::Duration::from_millis(80));
    
    // 可以分别获取不同端点的统计
    let users_stats = collector.get(metric.with_label_value("users")).unwrap();
    let products_stats = collector.get(metric.with_label_value("products")).unwrap();
    
    println!("Users端点: {:?}", users_stats);
    println!("Products端点: {:?}", products_stats);
}

文本报告输出

use measured::{Collector, Metric, TextReport};

fn main() {
    let collector = Collector::new();
    let metric = Metric::new("operation_time");
    
    // 进行一些测量...
    
    // 生成文本报告
    let report = TextReport::new();
    println!("{}", report.display(&collector));
    
    // 也可以输出特定指标的详细报告
    println!("{}", report.display_metric(&collector, metric));
}

性能提示

  1. 对于高频调用的代码路径,考虑使用measure的轻量级版本
  2. 避免在测量中包含不相关的代码
  3. 对于多线程应用,确保正确使用Arc共享收集器
  4. 生产环境中可以定期导出统计数据到监控系统

measured库是Rust生态中性能测量的强大工具,特别适合需要精确分析和优化关键代码路径的场景。

回到顶部