#性能 #基准测试 #计时 #条件编译

breezy-timer

无痛苦且适用于生产的计时器

4 个版本 (1 个稳定版)

1.0.0 2021年4月4日
0.1.2 2021年3月28日
0.1.1 2021年3月27日
0.1.0 2021年3月27日

#184 in 性能分析

MIT/Apache

15KB
123

Breezy timer ⏲️

Breezy timer 的目标是成为一个非常简单的计时库,它可以被直接放入生产代码中而不会改变最终性能。有关更多信息,请参阅工作原理部分。

目标

  • 简单 & 快速
  • 直接在生产代码中使用,
  • 发布时无需修改代码,只需禁用功能即可!

使用方法

将这些行添加到你的 Cargo.toml

[dependencies]
breezy-timer = "1.0.0"

[features]
breezy_timer = ["breezy-timer/breezy_timer"]

在编译时,如果你想记录时间,只需添加 feature breezy_timer,例如。

cargobuild foocrate --release --featuresbreezy_timer

如果没有明确提供功能,所有计时器在编译时都将消失。

API

start("foo"): 创建或更新名为 foo 的计时器,并将其设置为 ProcessTime::now()

stop("foo"): 计算自上次调用 start("foo") 以来经过的 ProcessTime,并将其添加到计时器状态中

elapsed("foo"): 返回 Option<Duration>,计时器 foo 所有时段的累积持续时间。当功能未激活时,返回 None

示例

取自 examples/basic_example.rs


use criterion::black_box;
use breezy_timer_lib::{BreezyTimer, Timer};

fn main(){
    let mut btimer = BreezyTimer::new();
    let mut vectors = Vec::new();

    btimer.start("total");
    for _ in 0..10 {
        btimer.start("allocations");
        let vec: Vec<u8> = (0..102400).map(|_| { rand::random::<u8>() }).collect();
        vectors.push(vec);
        btimer.stop("allocations");

        btimer.start("sum");
        let mut total = 0;
        for v in vectors.iter() {
            total += v.iter().map(|x| *x as u32).sum::<u32>();
        }
        // used so that compiler doesn't simply remove the loop because nothing is done with total
        black_box(total);
        btimer.stop("sum");
    }
    btimer.stop("total");

    println!("{:?}", btimer);
}

基准测试

还有一个基准测试文件来测试启用和禁用功能时的差异。你会发现当禁用时,计时与未计时的代码相同。

Usage:
cargo bench --features breezy_timer
cargo bench

工作原理

功能(features)是Rust编译机制的一种,允许您进行条件编译。这个包利用了这一点,并结合编译器优化“无用”代码的能力。当功能未激活时,所有函数都变为占位符,因此编译器会简单地删除它们。因此,发布时不会有性能下降,使从开发到发布的过渡变得无痛苦。

结构

BreezyTimer类型仅是对HashMap<&'static str, TimerState>的别称。TimerState对象用于跟踪当前间隔,以及所有之前间隔的持续时间总和。

未来工作

  • 添加get_json()函数,以获取格式为`{"timer-name": total_elapsed_ns}`的json格式的计时器。
  • 添加GlobalBreezyTimer,以及基于过程的宏和全局BreezyTimer的基于函数的计时。
  • 使用更简单的哈希器检查性能提升(默认情况下,HashMap使用DOS安全的哈希器)
  • 添加stop_start("foo", "bar")函数,以便轻松停止计时器foo并启动bar

许可证

此项目可任选以下许可证之一。

Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)

任选。

贡献

欢迎提交PR请求!

除非您明确说明,否则您提交的任何有意提交到globals的贡献,根据Apache-2.0许可证定义,应如上双重许可,不附加任何额外条款或条件。

依赖关系

~0.6–1MB
~15K SLoC