4 个版本
0.1.3 | 2021 年 6 月 17 日 |
---|---|
0.1.2 | 2021 年 3 月 26 日 |
0.1.1 | 2021 年 3 月 23 日 |
0.1.0 | 2021 年 3 月 23 日 |
在 Rust 模式 中排名 #584
每月下载量 17,985
在 94 个 包中使用(直接使用 14 个)
40KB
929 行代码(不包括注释)
loupe
🔎 loupe
是一组用于分析和性能分析的 Rust 代码的工具。目前,它仅提供有关内存使用的工具。它主要受 Wasmer 的需求驱动,但欢迎提出新功能!
loupe
是法语中表示 放大镜 的词,发音与 loop 相同。上面的鸟是 Fauvette à lunettes(Curruca conspicillata,眼镜鸫)。
安装
经典的 Cargo
步骤!将以下行添加到您的 Cargo.toml
文件中
[dependencies]
loupe = "0.1"
内存使用
loupe
提供了 MemoryUsage
特性。它允许以递归方式知道一个值的大小(以字节为单位)。因此,它尽可能深入地遍历大多数类型(有些类型缺失,欢迎贡献!),以及其字段或变体。希望它跟踪已访问的值,这样就不会进入无限 loupe 循环。该特性看起来像这样
pub trait MemoryUsage {
fn size_of_val(&self, tracker: &mut dyn MemoryUsageTracker) -> usize;
}
loupe
提供了一个 size_of_val
函数,它与 std::mem::size_of_val
函数非常相似。它可以以相同的方式使用。
loupe
导出了其最佳伴侣:来自 loupe-derive
包的一组实用程序宏,如果可能的话,可以自动实现 MemoryUsage
特性,在 struct
和 enum
上。
因此,只需编写
use loupe::MemoryUsage;
use std::mem;
#[derive(MemoryUsage)]
struct S {
x: Vec<i32>,
y: Vec<i32>,
}
fn main() {
let s = S {
x: vec![1, 2, 3],
y: vec![1, 2, 3],
};
assert_eq!(48, mem::size_of_val(&s));
assert_eq!(72, loupe::size_of_val(&s));
}
在上面的示例中,我们可以看到,Vec<i32>
的每个元素都被计算在值 s
的大小中。在 Wasmer 中,可以得到 Instance
的大小,它遍历 Module
、Store
、Engine
、Compiler
等。这是一个遍历并求每个值大小的完整值树。
有偏见的实现
尽管 MemoryUsage
已经为常见类型实现了,但仍然缺少一些类型。我们热烈欢迎更多的实现!然而,MemoryUsage
的实现
- 决不能改变值,
- 决不能崩溃或失败,
- 应尽可能确定(理想情况下,每次都如此)。
在同样的精神下,我们对 *const T
或 *mut T
(以及其他指针类型,如 NonNull
、UnsafeCell
等)的 MemoryUsage
实现只是返回指针的大小,但它不会解引用指针,因为这是不安全的。这并不意味着不能这样做:如果可以确保指针可以安全地解引用,那么这样做是完全可能的。
请记住,用户可以手动实现 MemoryUsage
;不需要为所有标准类型尝试提供一个默认实现。
最后,我们的实现当然不是完美的!欢迎挑战并讨论!
许可证
MIT
许可证,见 LICENSE
。
依赖关系
~0–395KB