Rust内存分配器mimalloc-rust的使用,高性能替代方案mimalloc的Rust绑定库
Rust内存分配器mimalloc-rust的使用,高性能替代方案mimalloc的Rust绑定库
mimalloc 1.7.9 stable
为什么创建这个
在另一个仓库中,我发现它没有提供任何数据类型,也没有包含mimalloc提供的所有功能,换句话说它很糟糕。
使用方法
首先添加依赖:
[dependencies]
mimalloc-rust = "0.2.1"
然后设置全局分配器:
use mimalloc_rust::*;
#[global_allocator]
static GLOBAL_MIMALLOC: GlobalMiMalloc = GlobalMiMalloc;
完整示例代码
下面是一个完整的示例,展示如何在Rust项目中使用mimalloc-rust:
// 引入mimalloc_rust库
use mimalloc_rust::GlobalMiMalloc;
// 设置全局分配器为mimalloc
#[global_allocator]
static GLOBAL_MIMALLOC: GlobalMiMalloc = GlobalMiMalloc;
fn main() {
// 使用mimalloc分配内存的示例
let mut vec = Vec::with_capacity(100);
// 填充数据
for i in 0..100 {
vec.push(i);
}
println!("使用mimalloc分配器创建的向量: {:?}", vec);
// 测试大内存分配
let large_vec: Vec<u8> = vec![0; 1024 * 1024 * 10]; // 10MB
println!("成功分配了10MB内存");
// 测试性能
let start = std::time::Instant::now();
for _ in 0..1000 {
let _ = vec![0u8; 1024]; // 1KB
}
println!("分配1000次1KB内存耗时: {:?}", start.elapsed());
}
这个示例展示了:
- 如何设置mimalloc为全局分配器
- 基本的向量分配和操作
- 大内存分配测试
- 简单的性能测试
MIT License
扩展示例代码
// 引入必要的库
use mimalloc_rust::GlobalMiMalloc;
use std::time::Instant;
// 设置全局分配器为mimalloc
#[global_allocator]
static GLOBAL_MIMALLOC: GlobalMiMalloc = GlobalMiMalloc;
fn main() {
// 示例1: 基本内存分配
basic_allocation();
// 示例2: 性能对比测试
performance_comparison();
// 示例3: 内存密集型操作
memory_intensive_operations();
}
fn basic_allocation() {
println!("=== 基本内存分配测试 ===");
// 分配小内存
let small_box = Box::new(42);
println!("小内存分配: {}", small_box);
// 分配中等大小内存
let medium_vec: Vec<u32> = (0..10000).collect();
println!("中等大小向量长度: {}", medium_vec.len());
// 分配大内存
let large_array = vec![0u64; 1_000_000];
println!("大数组长度: {}", large_array.len());
}
fn performance_comparison() {
println!("\n=== 性能对比测试 ===");
// 测试mimalloc性能
let mimalloc_start = Instant::now();
for _ in 0..10_000 {
let _ = Box::new([0u8; 1024]);
}
println!("mimalloc分配耗时: {:?}", mimalloc_start.elapsed());
// 注意: 这里不能同时测试标准分配器,因为已经设置了全局分配器
// 实际测试时需要分开进行
}
fn memory_intensive_operations() {
println!("\n=== 内存密集型操作 ===");
// 创建大型哈希表
use std::collections::HashMap;
let mut map = HashMap::new();
let start = Instant::now();
for i in 0..100_000 {
map.insert(i, i * 2);
}
println!("插入10万条数据耗时: {:?}", start.elapsed());
// 字符串操作测试
let mut s = String::new();
let start = Instant::now();
for _ in 0..10_000 {
s.push_str("test ");
}
println!("字符串拼接耗时: {:?}", start.elapsed());
}
这个扩展示例展示了:
- 基本内存分配操作
- 性能测试方法
- 内存密集型操作示例
- 各种数据类型的内存分配
注意:由于全局分配器已设置为mimalloc,无法在同一程序中比较标准分配器的性能。实际测试时应该创建两个独立的项目进行比较。
1 回复
Rust内存分配器mimalloc-rust的使用
简介
mimalloc-rust 是微软 mimalloc 高性能内存分配器的 Rust 绑定库。mimalloc (microsoft malloc) 是一个通用的内存分配器,具有出色的性能表现,特别适合多线程环境下的高并发场景。
mimalloc 的主要特点包括:
- 比 glibc、jemalloc 和 tcmalloc 等主流分配器更快的分配速度
- 内存开销低
- 线程局部缓存减少锁争用
- 良好的内存回收机制
完整示例代码
下面是一个完整的演示如何使用 mimalloc-rust 的示例,包含了全局分配器替换、局部使用和性能测试:
use mimalloc::MiMalloc;
use std::time::Instant;
// 全局替换分配器为 mimalloc
#[global_allocator]
static GLOBAL: MiMalloc = MiMalloc;
fn main() {
// 示例1:全局使用 mimalloc
example_global_allocator();
// 示例2:局部使用 mimalloc
example_local_allocator();
// 示例3:性能测试
performance_comparison();
}
// 全局分配器示例
fn example_global_allocator() {
println!("=== 全局分配器示例 ===");
// 所有标准集合类型将自动使用 mimalloc
let mut vec = vec![];
for i in 0..5 {
vec.push(i);
}
println!("使用全局分配器的向量: {:?}", vec);
}
// 局部分配器示例
fn example_local_allocator() {
println!("\n=== 局部分配器示例 ===");
// 创建局部分配器实例
let allocator = MiMalloc;
// 使用特定分配器创建集合
let mut vec = Vec::new_in(&allocator);
vec.push("局部");
vec.push("分配");
vec.push("示例");
println!("使用局部分配器的向量: {:?}", vec);
}
// 性能对比测试
fn performance_comparison() {
println!("\n=== 性能测试 ===");
// 测试1:大量小对象分配
let start = Instant::now();
for _ in 0..1_000_000 {
let _ = Box::new(42);
}
println!("100万个小对象分配耗时: {:?}", start.elapsed());
// 测试2:大对象分配
let start = Instant::now();
for _ in 0..10_000 {
let _ = Vec::<u8>::with_capacity(1024); // 1KB
}
println!("1万个1KB向量分配耗时: {:?}", start.elapsed());
// 测试3:多线程分配
let start = Instant::now();
let handles: Vec<_> = (0..4).map(|_| {
std::thread::spawn(|| {
for _ in 0..250_000 {
let _ = Box::new(42);
}
})
}).collect();
for handle in handles {
handle.join().unwrap();
}
println!("4线程各25万次分配总耗时: {:?}", start.elapsed());
}
示例说明
-
全局分配器替换:通过
#[global_allocator]
属性将 mimalloc 设置为全局分配器,所有标准集合类型将自动使用它 -
局部分配器使用:通过创建
MiMalloc
实例并使用new_in
方法创建特定集合,可以局部使用 mimalloc -
性能测试:
- 测试小对象(Box)的高频分配性能
- 测试中等大小对象(Vec)的分配性能
- 测试多线程环境下的分配性能
-
配置选项:可以通过环境变量在程序启动前配置 mimalloc 的行为,如使用大内存页等
运行建议
-
对于长期运行的服务,建议启用大内存页:
MIMALLOC_LARGE_OS_PAGES=1 cargo run --release
-
要查看分配统计信息,可以设置:
MIMALLOC_SHOW_STATS=1 cargo run --release
-
在性能关键应用中,建议使用 release 模式编译以获得最佳性能