#low-overhead #multi-threading #applications #measure #events #frequency

micrometer

为多线程应用程序中的快速、高频事件提供低开销的性能分析

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性能分析 中排名

Download history 13/week @ 2024-05-20 8/week @ 2024-05-27 7/week @ 2024-06-03 10/week @ 2024-06-10 1/week @ 2024-06-17 11/week @ 2024-07-01 56/week @ 2024-07-29

每月 56 次下载
2 crates 中使用

Apache-2.0

36KB
754 代码行

微米器

Crates.io Documentation

为多线程应用程序中的快速、高频事件提供低开销的性能分析

重要:启用数据收集

默认情况下,每个度量都是无操作,要测量和消费度量,请启用 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