22个版本
新版本 0.6.0 | 2024年8月18日 |
---|---|
0.5.4 | 2021年5月10日 |
0.5.3 | 2020年5月25日 |
0.4.4 | 2019年10月29日 |
0.1.6 | 2019年2月2日 |
#30 in 内存管理
38,293 每月下载量
用于 21 个Crate (9 个直接使用)
2.5MB
378 行
对象池
一个线程安全的对象池,具有自动返回和附加/分离语义
对象池的目标是重用昂贵或频繁分配的对象
使用方法
[dependencies]
object-pool = "0.5"
extern crate object_pool;
示例
创建池
一般池创建看起来像这样
let pool: Pool<T> = Pool::new(capacity, || T::new());
示例:具有4096个容量的32 Vec<u8>
let pool: Pool<Vec<u8>> = Pool::new(32, || Vec::with_capacity(4096));
使用池
从池中获取的基本用法
let pool: Pool<Vec<u8>> = Pool::new(32, || Vec::with_capacity(4096));
let mut reusable_buff = pool.try_pull().unwrap(); // returns None when the pool is saturated
reusable_buff.clear(); // clear the buff before using
some_file.read_to_end(reusable_buff);
// reusable_buff is automatically returned to the pool when it goes out of scope
从池中取出并 detach()
let pool: Pool<Vec<u8>> = Pool::new(32, || Vec::with_capacity(4096));
let mut reusable_buff = pool.try_pull().unwrap(); // returns None when the pool is saturated
reusable_buff.clear(); // clear the buff before using
let (pool, reusable_buff) = reusable_buff.detach();
let mut s = String::from(reusable_buff);
s.push_str("hello, world!");
pool.attach(s.into_bytes()); // reattach the buffer before reusable goes out of scope
// reusable_buff is automatically returned to the pool when it goes out of scope
跨线程使用
您只需将池包装在 std::sync::Arc
let pool: Arc<Pool<T>> = Arc::new(Pool::new(cap, || T::new()));
警告
池中的对象不会被自动重置,它们被返回,但不会被重置。您可能需要在从池中取出对象后调用 object.reset()
或 object.clear()
或您正在使用的对象的任何等效方法
查看 文档 获取更多示例
性能
基准测试比较了 alloc()
与 pool.try_pull()
与 pool.detach()
。
查看结果
对于那些不喜欢图表的人来说,这里有原始输出