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());
}
这个示例展示了如何:
- 定义带有标签的计数器
- 测量并记录响应时间
- 跟踪错误数量
- 使用直方图分析响应时间分布
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));
}
性能提示
- 对于高频调用的代码路径,考虑使用
measure
的轻量级版本 - 避免在测量中包含不相关的代码
- 对于多线程应用,确保正确使用
Arc
共享收集器 - 生产环境中可以定期导出统计数据到监控系统
measured
库是Rust生态中性能测量的强大工具,特别适合需要精确分析和优化关键代码路径的场景。