#memory #profiler #allocator #performance

memoria

内存分配跟踪器。一个用于生产的糟糕的内存分析器。

1 个不稳定版本

0.1.0 2023年5月24日

#541 in 内存管理

MIT 许可证

17KB
257 代码行

memoria

一个用于生产的糟糕的内存“分析器”。

  1. 定义一个 UseCase 枚举。
  2. 使用memoria的自定义分配器。
  3. 使用 Alloc::with_usecase 将用例分配给函数或代码块。
  4. 获取每个用例的基本内存使用统计信息,可以在程序末尾或在后台线程中定期获取。

文档, Crates.io

use num_enum::{TryFromPrimitive, IntoPrimitive};

#[derive(TryFromPrimitive, IntoPrimitive, Default, Debug)]
#[repr(u32)]
enum MyUseCase {
    #[default]
    None,
    LoadConfig,
    ProcessData,
}

impl memoria::UseCase for MyUseCase {}

#[global_allocator]
static ALLOCATOR: memoria::Alloc<MyUseCase> = memoria::Alloc::new();

fn load_config() {
    let _guard = ALLOCATOR.with_usecase(MyUseCase::LoadConfig);
    println!("loading config...");
    // consume some memory
    let _temporary = vec![0u8; 256];
}

fn process_data() {
    let _guard = ALLOCATOR.with_usecase(MyUseCase::ProcessData);
    // consume some more memory
    let _temporary = vec![0u8; 2048];
}

fn main() {
    load_config();
    process_data();

    println!("memory usage stats:");
    ALLOCATOR.with_recorder(|recorder| {
        recorder.flush(
            |usecase, stat| {
                println!("{usecase:?}: {stat:?}");
            },
            |err, count| {
                println!("{err:?}: {count}");
            }
        );
        Ok(())
    }).ok();
}

许可证

MIT 许可证,见 ./LICENSE.

依赖项

~0.9–6MB
~20K SLoC