#benchmark #bench #memory #task #cargo #graph #history

开发工具 glassbench

带内存的 Rust 性能基准

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

Download history 191/week @ 2024-05-03 104/week @ 2024-05-10 127/week @ 2024-05-17 88/week @ 2024-05-24 144/week @ 2024-05-31 103/week @ 2024-06-07 136/week @ 2024-06-14 131/week @ 2024-06-21 106/week @ 2024-06-28 230/week @ 2024-07-05 177/week @ 2024-07-12 84/week @ 2024-07-19 105/week @ 2024-07-26 178/week @ 2024-08-02 330/week @ 2024-08-09 252/week @ 2024-08-16

875 每月下载次数
用于 4 crates

MIT 许可证

1.5MB
1.5K SLoC

Rust 1K SLoC // 0.0% comments JavaScript 472 SLoC // 0.1% comments

Latest Version docs Chat on Miaou MIT

Glassbench 是一个用于与 cargo bench 一起使用的内存微基准库。

为什么

运行基准测试并与之前的执行进行比较

cargo bench

您将获得所有定义的任务的平均持续时间的紧凑表格

tbl

记录每个测试,带有标签以帮助您比较策略

读取项目基准测试的完整历史记录,因为所有内容都存储在 SQLite 中。

cargo bench -- -- --history 2

history

当尝试优化策略或怀疑可能影响性能的任何事物时,您可以标记基准执行

cargo bench -- -- --tag "no zero"

通过标签筛选各种测试,绘制图表

打开绘图器

cargo bench -- -- --graph

(是的,在 --graph 前面有两个 --)

绘制特定任务

cargo bench -- my_task -- --graph 2

具有表格和图形视图的查看器在您的浏览器中打开

graph

可以使用鼠标滚轮缩放图表,并使用鼠标移动

您也可以在表格中读取精确数据

table

一切都在独立的 HTML 页面中嵌入,没有正在运行的过程。该页面甚至可以发送或托管。

使用 SQL 读取或编辑基准历史记录

使用 sqlite3 命令行外壳,您可以运行自己的 SQL 查询

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",
    "",
];

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 的组),经过几次尝试和一些优化后,将产生类似以下内容

sort tbl

请注意,您不应该过度使用系统,否则您将无法比较执行。最好在完成之前关闭其他所有内容。

只运行一个基准测试

指定基准测试的 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