#benchmark #tracing #scope #chrome #further #analyzation #chrome-tracing

gbench

此包提供使用 Chrome 追踪进行代码基准测试的工具,以进行进一步分析

8 个版本 (2 个稳定版)

1.0.1 2021年7月10日
1.0.0 2021年3月2日
0.3.1 2021年2月25日
0.2.2 2021年2月24日
0.1.0 2021年2月22日

#162 in 性能分析

MIT 许可协议

25KB
400

gbench

此包提供使用 Chrome 追踪进行代码基准测试的工具,以进行进一步分析。该包完全由 Rust 编写,无依赖项。

优点

  • 如果关闭 debug_assertions,该包基于宏,这些宏将为空
  • 写入基准测试数据几乎不会影响时间(在我的机器上每条跟踪1毫秒)
  • 简单的宏语法
  • 您可以控制收集的数据的保存方式

示例

有关更多示例和使用指南,请访问文档

use gbench::{instantiate, scope, ChromeTracing};
use std::thread;

fn calculate(num: f32, n: u32) -> f32 {
    (0..n)
        .fold((num, 0.0), |(x, v), _| (x + v * 0.01, v - x * 0.001))
        .0
}

fn main() {
    instantiate!(ChromeTracing("target/bench"));

    scope!(program_scope | "Program scope");

    // Doing the work that needs benchmarking
    for _ in 0..5 {
        scope!(main | "Main scope");

        // Spawning a thread to do work
        let thread = thread::spawn(move || {
            // This benchmarks the scope that it is in
            scope!(child | "Child");

            calculate(1.0, 1_500_000)
        });

        // You can organize your subtasks in scopes to
        // benchmark them
        scope!(imp | "An important task");

        {
            scope!(i1 | "Important subtask");
            calculate(1.0, 300_000);
        }

        {
            scope!(i2 | "Less important subtask");
            calculate(1.0, 500_000);
        }

        // If the block of code that you need to benchmark
        // has ended you can drop the guard if the scope
        // has not ended
        drop(imp);

        // Marking the start of another task
        scope!(join | "Joining thread");
        thread.join().unwrap();

        // This line of code is unnecessary but I like
        // to keep it
        drop(join);
    }
}

上面的代码生成以下跟踪

image

链接

无运行时依赖