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