9 个版本
0.2.7 | 2023年10月24日 |
---|---|
0.2.6 | 2023年7月13日 |
0.2.3 | 2023年4月20日 |
0.2.0 | 2023年3月20日 |
0.1.0 | 2023年2月27日 |
#65 在 性能分析 中排名
每月 56 次下载
在 2 crates 中使用
36KB
754 代码行
微米器
为多线程应用程序中的快速、高频事件提供低开销的性能分析
重要:启用数据收集
默认情况下,每个度量都是无操作,要测量和消费度量,请启用 enable
功能。这是为了允许库在没有人使用度量时,无需运行时成本即可对其代码进行跟踪。
定义
- 测量:测量是指为单个事件收集的计时数据。
- 记录:记录是测量检索的格式。记录可能与测量一一对应,但是,如果启用了 perforation(默认),随着测量数量的增加,单个记录可能是多个测量的聚合。
- 位置:位置是程序的感兴趣区域。所有测量都从位置开始。每个测量都与它起源的位置名称相关联。
- 线程位置:由于
micrometer
是针对多线程环境设计的,因此每个 位置 可能与多个线程相关,特定线程的上下文中的位置称为 线程位置 Span
:一个 span 是一个测量从创建到丢弃(除非它被解除)之间时间的守卫对象。每个 span 将生成一个测量。Track
:一个 track 是处理从 线程位置 出发的所有 测量 的结构。它用于创建 span 或手动记录事件的持续时间。TrackPoint
:虽然 track 映射到 线程位置 的概念(因为单个 track 只能由一个线程拥有),但 track point 映射到 位置 的概念。Track point 结构是针对同一名称关联的多个 track 的懒分配、线程局部句柄。通常,track points 用作静态变量,使用get_or_init
方法获取活动线程的 track。
示例
测量循环的持续时间
for _ in 0..100 {
// Define a `TrackPoint` named "loop_duration", get (or init) the `Track` for the
// current thread, then create a span and assign it to a new local variable called
// `loop_duration`
micrometer::span!(loop_duration);
std::hint::black_box("do something");
// `loop_duration` is automatically dropped recording the measure
}
// Print a summary of the measurements
micrometer::summary();
测量循环的持续时间,多线程
std::thread::scope(|s| {
for t in 1..=4 {
s.spawn(move || {
for _ in 0..(10 * t) {
micrometer::span!(); // Name automatically assigned to source file and line
std::hint::black_box("do something");
}
});
}
});
// Print a summary of the measurements
micrometer::summary();
// Print a summary of the measurements, aggregating measures for the same location
micrometer::summary_grouped();
测量表达式的持续时间
// This works like the `dbg!` macro, allowing you to transparently wrap an expression:
// a span is created, the expression is executed, then the span is closed and the result
// of the expression is passed along
let a = micrometer::span!(5 * 5, "fives_sq");
let b = micrometer::span!(a * a); // Name automatically assigned to source file and line
assert_eq!(a, 25);
assert_eq!(b, 25 * 25);
测量代码段
let a = 5;
micrometer::span!(guard, "a_sq");
let b = a * a;
drop(guard); // Measurement stops here
let c = b * a;
依赖项
~0.4–5.5MB
~12K SLoC