#benchmark #multi-thread #json-toml #reproducible #accurate #framework #json-file

shumai

一个强大的基准测试框架,用于高效且正确地进行多线程基准测试

34 个版本

0.2.15 2024年4月7日
0.2.14 2024年1月10日
0.2.13 2023年4月4日
0.2.12 2023年2月11日
0.1.0 2021年11月28日

#36性能分析 分类中

Download history 1/week @ 2024-04-26 4/week @ 2024-05-03 6/week @ 2024-05-17 8/week @ 2024-05-24 2/week @ 2024-05-31 1/week @ 2024-06-07 1/week @ 2024-06-14

1,736 每月下载量
2 crates 中使用

MIT 许可证

33KB
759

虾饺

Crates.io shumai dependency status

虾饺是一个多线程基准测试框架,能够产生准确且可重复的结果。

虾饺是作为 Alchemy 项目的一部分开发的,以满足其关于准确和可重复基准测试的学术要求。虾饺通过自动收集系统信息、基准配置和基准结果,将可重复性作为首要任务。所有这些数据都将存储在 json 文件中。基准配置也存储在 toml 文件中,该文件应置于版本控制之下。

示例

# benchmark.toml

[[Foo]]
name = "foo"
threads = [1, 2, 3]
time = 1
parameter = [1, 2]
// bench_config.rs

#[config(path = "benchmark.toml")]
pub struct Foo {
  pub name: String,
  pub threads: Vec<usize>,
  pub time: usize,
  #[matrix]
  pub parameter: usize,
}


impl ShumaiBench for TestBench {
    type Result = usize;
    type Config = Foo;

    fn load(&self) -> Option<Value> {
        None
    }

    fn run(&self, context: BenchContext<Foo>) -> Self::Result {
	// Barrier to ensure all threads start at the same time
        context.wait_for_start(); 

	// start benchmark
        todo!()
    }

    fn cleanup(&self) -> Option<Value> {
        None
    }
}


fn main() {
    let config = Foo::load()
        .expect("Failed to parse config!");
    let repeat = 3;

    for c in config.iter() {
        let benchmark = TestBench::default();
        let result = shumai::run(&benchmark, c, repeat);
        result.to_json() // save results to a json file
    }
}

以上设置下,虾饺将基准测试结果写入 json 文件

{
  "config": {
    "name": "foo-foo-1",
    "threads": [
      1,
      2,
      3
    ],
    "time": 1,
    "a": 1
  },
  "load_results": null,
  "env": {
    "os_release": "5.10.60.1-microsoft-standard-WSL2",
    "rustc_version": "1.59.0",
    "hostname": "DESKTOP-DPOIAG6",
    "cpu_num": 16,
    "cpu_speed": 2894
  },
  "bench_results": [
    {
      "thread_cnt": 1,
      "bench_results": [
        110484492
      ],
      "pcm": [],
      "perf": null
    },
    {
      "thread_cnt": 2,
      "bench_results": [
        222437918
      ],
      "pcm": [],
      "perf": null
    },
    {
      "thread_cnt": 3,
      "bench_results": [
        315043334
      ],
      "pcm": [],
      "perf": null
    }
  ]
}

功能

  • flamegraph 功能在零配置下生成基准函数的 flamegraph(而不是整个程序的 flamegraph)。

  • pcm 功能收集 pcm 相关数据,例如 L3 缓存命中/未命中、内存带宽(包括 DRAM 和 PM)、UPI 带宽等。它需要在目标主机上运行 pcm-server。

  • perf 功能收集常见的 perf 统计数据,例如 CPU_CYCLESINSTRUCTIONSBRANCH_MISSES 等。

注意,上述功能可能相互排斥,即您可能一次只能启用一个功能。

控制基准测试执行

虾饺有两个环境变量用于控制基准测试的执行方式

  • SHUMAI_THREAD:仅使用指定的线程数运行基准测试,它必须在基准测试配置中指定。
  • SHUMAI_FILTER:过滤配置,它必须是一个有效的正则表达式字符串。

依赖项

~7–38MB
~603K SLoC