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 在 性能分析 分类中
1,736 每月下载量
在 2 crates 中使用
33KB
759 行
虾饺
虾饺是一个多线程基准测试框架,能够产生准确且可重复的结果。
虾饺是作为 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_CYCLES
、INSTRUCTIONS
、BRANCH_MISSES
等。
注意,上述功能可能相互排斥,即您可能一次只能启用一个功能。
控制基准测试执行
虾饺有两个环境变量用于控制基准测试的执行方式
SHUMAI_THREAD
:仅使用指定的线程数运行基准测试,它必须在基准测试配置中指定。SHUMAI_FILTER
:过滤配置,它必须是一个有效的正则表达式字符串。
依赖项
~7–38MB
~603K SLoC