13 个版本
0.5.1 | 2022年5月20日 |
---|---|
0.5.0 | 2021年8月11日 |
0.4.6 | 2021年3月31日 |
0.4.5 | 2021年2月23日 |
0.1.0 | 2020年6月14日 |
#31 在 分析 分类中
86,191 次每月下载
在 49 个包(8 个直接使用) 中使用
9KB
139 行
Firestorm 是 Rust 的低开销侵入式火焰图分析器。
要开始分析,请 点击此处。
要开始分析,请 点击此处。
Firestorm 使用 inferno
在底层显示火焰图。没有他们的贡献,Firestorm 将无法实现。
设计原则
Firestorm 是性能。当你正在编写一个在其类别中速度最快的库时,你需要一个具有相同理想的分析器。当 Firestorm 未启用(默认情况)时,所有调用都会编译成无操作。当 Firestorm 启用时,它不会进行堆分配,并在关键部分避免尽可能多的工作。
Firestorm 是无处不在。当应用程序层启用 Firestorm 进行分析时,它会对所有依赖项进行递归启用。这无需在库中添加功能标志,甚至无需知道哪些库使用 Firestorm。通过避免将 Firestorm 作为库的公共 API 的一部分,并结合 Firestorm 在未使用时编译成无操作的事实,将 Firestorm 添加到库中应该是一件轻而易举的事情。这是因为随着更多库采用 Firestorm,应用程序将从中受益。
Firestorm 是洞察。分析后,Firestorm 提供了三种不同的方式来查看数据 - 从不同的角度查看运行的性能。
分析
首先,将 Firestorm 添加到你的 Cargo.toml 依赖中
[dependencies]
firestorm = "0.4"
然后,导入 Firestorm 的分析宏。我建议在 prelude
模块中这样做。
pub(crate) use firestorm::{
profile_fn,
profile_method,
profile_section
};
最后,在你的函数中调用宏。
fn fn_name<T>(param: T) {
// Call profile_fn at the top of your function, specifying the function name.
// You can optionally add generic parameters, too
profile_fn!(T, fn_name);
// If a function is complex, profile a section.
{
profile_section!(inner);
// Optional: manually drop.
// Section automatically drops when going out of scope.
drop(inner);
}
}
fn method_name(&self) {
// profile_method automatically captures the type of Self
profile_method!(method_name);
}
对库进行分析的重要提示
- 请勿针对Firestorm的特定版本进行目标定位。例如:不要使用
firestorm = "=0.4.1"
。请使用firestorm = "0.4.1"
代替。这是Firestorm向后兼容策略的重要组成部分。如果需要更新firestorm-core
,所有主要版本都将收到补丁,以便启用所有版本的Firestorm。针对特定版本可能会阻止库共享firestorm-core
依赖或通过传递方式启用。 - 请勿将firestorm放入
[dev-dependencies]
中。始终将firestorm放入[dependencies]
中。 - 请勿在库代码中启用任何firestorm功能,例如
enable_system_time
。这样做将阻止Firestorm在未使用时编译为无操作。 - 请勿将Firestorm的使用隐藏在功能标志或
[cfg()]
之下。Firestorm应始终在使用中,除非启用,否则不会影响编译时间或性能。
性能分析
要启用性能分析,Firestorm需要在 Cargo.toml
中指定一个附加功能。
[dependencies]
firestorm = { version="0.4", features=["enable_system_time"] }
分析会话并保存结果
// Runs the function and saves the flamegraph to the supplied directory.
// Make sure this is an empty directory so that no important files are overwritten.
if firestorm::enabled() {
firestorm::bench("./flames/", instrumented_function).unwrap();
}
运行以上命令后,目标目录中将有 firestorm.html
文件和一个包含支持文件的 /firestorm
子目录。打开 firestorm.html
查看结果。
有三个输出火焰图,以不同的方式聚合数据。左上角的下拉菜单切换模式。
时间轴
此模式为每个函数的每次调用显示一个单独的条形图。它被称为“时间轴”,因为数据似乎y轴是时间。如果你想在很多短调用与一个长调用之间进行区分,这特别有用。这包含最多的信息,但可能会有些嘈杂。
合并
此模式为调用栈中的每个路径显示一个条形图。多个调用可以显示在单个条形图中。这聚合了更多信息。像时间轴模式一样,条形的宽度表示函数的总时间 - 包括自己的时间和被调用的函数时间。
自己的时间
此模式显示每个函数自己的时间作为一个侧向条形图,不管它被谁调用。排序是最耗时的在底部,而“堆栈”与哪个函数调用其他函数无关。遗憾的是,我们的火焰图依赖项不理解这一点,所以请忽略那部分。Firestorm应该改善这里的显示方法,但鉴于它的有用性,我们无法在第一版中省略。
lib.rs
:
Firestorm是Rust的低开销侵入式火焰图性能分析器。有关文档和用法,请参阅Github上的Firestorm
依赖关系
~0–7.5MB
~46K SLoC