15 个版本
0.4.3 | 2024年8月15日 |
---|---|
0.4.1 | 2024年1月29日 |
0.3.6 | 2023年10月16日 |
0.3.5 | 2023年5月23日 |
0.2.2 | 2021年3月28日 |
#34 in 性能分析
875 每月下载次数
用于 4 crates
1.5MB
1.5K SLoC
Glassbench 是一个用于与 cargo bench
一起使用的内存微基准库。
为什么
运行基准测试并与之前的执行进行比较
cargo bench
您将获得所有定义的任务的平均持续时间的紧凑表格
记录每个测试,带有标签以帮助您比较策略
读取项目基准测试的完整历史记录,因为所有内容都存储在 SQLite 中。
cargo bench -- -- --history 2
当尝试优化策略或怀疑可能影响性能的任何事物时,您可以标记基准执行
cargo bench -- -- --tag "no zero"
通过标签筛选各种测试,绘制图表
打开绘图器
cargo bench -- -- --graph
(是的,在 --graph
前面有两个 --
)
绘制特定任务
cargo bench -- my_task -- --graph 2
具有表格和图形视图的查看器在您的浏览器中打开
可以使用鼠标滚轮缩放图表,并使用鼠标移动
您也可以在表格中读取精确数据
一切都在独立的 HTML 页面中嵌入,没有正在运行的过程。该页面甚至可以发送或托管。
使用 SQL 读取或编辑基准历史记录
使用 sqlite3 命令行外壳,您可以运行自己的 SQL 查询
如果您喜欢,可以删除一定时期的基准测试,更改标签等。
如果您想删除整个历史记录,只需简单地删除 glassbench_v1.db
文件即可。
用法
完整的可测试示例在 /examples/lettersorter
中。
添加 dev 依赖项
[dev-dependencies]
glassbench = "0.3"
准备基准测试
您的基准文件位于 /benches
,必须有一个定义任务函数和 glassbench!
调用的函数。
在此处,我们定义了一组任务,包含两个任务,强调使用两种输入对 lettersort::sort
函数。
use {
lettersorter::sort,
glassbench::*,
};
static SMALL_NUMBERS: &[&str] = &[
"0.123456789",
"42",
"-6",
"π/2",
"e²",
];
static BIG_NUMBERS: &[&str] = &[
"424568",
"45865452*44574*778141*78999",
"same but even bigger",
"42!",
"infinite",
];
fn bench_number_sorting(bench: &mut Bench) {
bench.task("small numbers", |task| {
task.iter(|| {
for n in SMALL_NUMBERS {
pretend_used(sort(n));
}
});
});
bench.task("big numbers", |task| {
task.iter(|| {
for n in BIG_NUMBERS {
pretend_used(sort(n));
}
});
});
}
glassbench!(
"Number Sorting",
bench_number_sorting,
// you can pass other task defining functions here
);
您提供给 b.iter
的回调将在初始预热之后多次执行。
如果您有一些准备工作要做,请在 b.iter
之前完成。
为了防止编译器优化掉您的函数,请将您构建的值传递给 pretend_used
。
必须在 Cargo.toml
中定义基准测试,并使用 harness = false
[[bench]]
name = "sort_numbers"
harness = false
在完成基准测试准备工作之前,您可能不想保存结果,因此您将使用以下方式运行 glassbench:
cargo bench -- -- --no-save
基准测试命令概述
该命令具有以下形式
cargo bench -- <optional list of benchs to run> -- <glassbench arguments>
基准测试的名称是基准测试文件的名称(见下面的示例)。
glassbench 参数允许您显示历史记录或为特定任务绘制记录,指定标记等。
运行所有基准测试
cargo bench
这将运行所有基准测试组(即使是那些不使用 Glassbench 的组),经过几次尝试和一些优化后,将产生类似以下内容
请注意,您不应该过度使用系统,否则您将无法比较执行。最好在完成之前关闭其他所有内容。
只运行一个基准测试
指定基准测试的 ID(从基准测试文件名称中获取)后跟 --
cargo bench -- sort_numbers
(由于我们的示例只有一个基准测试,所以这是无用的)
您可以指定多个基准测试,如下所示
cargo bench -- sort_numbers sort_colors sort_flowers
带有标记的基准测试
假设我们正在尝试具有显著条件,也许是一种天才策略,那么我们可能希望在历史记录中包含这些信息。我们可以这样做:
cargo bench -- sort_numbers -- --tag "deep learning"
查看特定任务的历史记录
您通过表格中的任务编号来引用任务
cargo bench -- sort_numbers --history 1
绘制任务执行图
在第二个 --
之后给出其他参数。要绘制任务,请通过表格中的编号来引用它
cargo bench -- sort_numbers -- --graph 1
这将在您的浏览器中打开一个 "sort_numbers" 基准测试的第一个(1
)任务的持续时间(纳秒)的图形。
(注意:该图形是一个正在进行中的项目,未来应进行改进)
其他参数
--no-save
仅运行基准测试,并与以前的保存执行进行比较,但不保存结果
cargo bench -- -- --no-save
使用 SQLite 读取(或重写)历史记录
历史记录保存在本地的 glassbench_v1.db
sqlite3 文件中。
您应该将其路径放在您的 vcs 忽略列表中,因为度量无法从一台计算机与其他计算机进行比较。
要进入交互式 SQL 会话,请这样做
sqlite3 glassbench_v1.db
除了 SQL 查询之外,您可能还会发现 .schema
有用,它显示了表,以及 .quit
。
限制
Glassbench 测量您函数实际花费的时间。这是对用户来说很重要的时间,但它对系统负载极为敏感,并且无法在不同计算机之间进行比较。
在查看历史记录时,必须谨慎。变化可能与不仅仅是您的代码效率有关:即使您没有更改任务,也可能有系统负载或效率的变化。
替代方案
Criterion 与其非常相似。它生成详细的报告,比 Glassbench 选项更多,但没有之前的 cargo bench
(通常是你最需要的)历史记录。Glassbench 尝试提供更紧凑且更易于阅读的显示,并鼓励你定义尽可能多的性能影响输入类型的任务。
许可证
MIT
依赖项
~51MB
~1M SLoC