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

Download history 12550/week @ 2024-03-16 11492/week @ 2024-03-23 8444/week @ 2024-03-30 7789/week @ 2024-04-06 11131/week @ 2024-04-13 9110/week @ 2024-04-20 7693/week @ 2024-04-27 10261/week @ 2024-05-04 6968/week @ 2024-05-11 8033/week @ 2024-05-18 6772/week @ 2024-05-25 7968/week @ 2024-06-01 5647/week @ 2024-06-08 5027/week @ 2024-06-15 3843/week @ 2024-06-22 1799/week @ 2024-06-29

每月下载量 17,985
94 包中使用(直接使用 14 个)

MIT 许可证

40KB
929 行代码(不包括注释)


loupe

crates.io documentation

🔎 loupe 是一组用于分析和性能分析的 Rust 代码的工具。目前,它仅提供有关内存使用的工具。它主要受 Wasmer 的需求驱动,但欢迎提出新功能!

loupe 是法语中表示 放大镜 的词,发音与 loop 相同。上面的鸟是 Fauvette à lunettesCurruca 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 特性,在 structenum 上。

因此,只需编写

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 的大小,它遍历 ModuleStoreEngineCompiler 等。这是一个遍历并求每个值大小的完整值树。

有偏见的实现

尽管 MemoryUsage 已经为常见类型实现了,但仍然缺少一些类型。我们热烈欢迎更多的实现!然而,MemoryUsage 的实现

  • 决不能改变值,
  • 决不能崩溃或失败,
  • 应尽可能确定(理想情况下,每次都如此)。

在同样的精神下,我们对 *const T*mut T(以及其他指针类型,如 NonNullUnsafeCell 等)的 MemoryUsage 实现只是返回指针的大小,但它不会解引用指针,因为这是不安全的。这并不意味着不能这样做:如果可以确保指针可以安全地解引用,那么这样做是完全可能的。

请记住,用户可以手动实现 MemoryUsage;不需要为所有标准类型尝试提供一个默认实现。

最后,我们的实现当然不是完美的!欢迎挑战并讨论!

许可证

MIT 许可证,见 LICENSE

依赖关系

~0–395KB