所有 notable(显著的)变化都会记录在这个文件里。
本项目的版本号遵循 语义化版本 2.0.0。
测试数据 root@LAPTOP-CEH85GLR:/home/requiem/pool/cppMemoryPool# # 一键清理、编译并跑分 rm -f pool_bench && g++ -O3 -std=c++17 main_benchmark.cpp memory.cpp -o pool_bench -lpthread -lbenchmark -Wno-interference-size && ./pool_bench 2026-07-20T22:22:41+08:00 Running ./pool_bench Run on (20 X 2918.4 MHz CPU s) CPU Caches: L1 Data 48 KiB (x10) L1 Instruction 32 KiB (x10) L2 Unified 1280 KiB (x10) L3 Unified 24576 KiB (x1) Load Average: 0.09, 0.02, 0.01
BM_CustomMemoryPool/real_time/threads:1 574 ns 574 ns 1169914 BM_CustomMemoryPool/real_time/threads:2 650 ns 650 ns 1200444 BM_CustomMemoryPool/real_time/threads:4 655 ns 655 ns 1104468 BM_CustomMemoryPool/real_time/threads:8 1212 ns 1212 ns 1059328 BM_CustomMemoryPool/real_time/threads:16 925 ns 925 ns 812736 BM_SystemMalloc/real_time/threads:1 497 ns 497 ns 1398829 BM_SystemMalloc/real_time/threads:2 508 ns 508 ns 1366848 BM_SystemMalloc/real_time/threads:4 529 ns 529 ns 1268012 BM_SystemMalloc/real_time/threads:8 651 ns 651 ns 800000 BM_SystemMalloc/real_time/threads:16 780 ns 780 ns 981504 root@LAPTOP-CEH85GLR:/home/requiem/pool/cppMemoryPool# rm -f pool_bench && g++ -O3 -std=c++17 main_benchmark.cpp memory.cpp -o pool_bench -lpthread -lbenchmark -Wno-interference-size && ./pool_bench 2026-07-20T22:26:07+08:00 Running ./pool_bench Run on (20 X 2918.4 MHz CPU s) CPU Caches: L1 Data 48 KiB (x10) L1 Instruction 32 KiB (x10) L2 Unified 1280 KiB (x10) L3 Unified 24576 KiB (x1) Load Average: 0.08, 0.02, 0.01
BM_CustomMemoryPool/real_time/threads:1 101 ns 101 ns 6837385 BM_CustomMemoryPool/real_time/threads:2 104 ns 104 ns 6610182 BM_CustomMemoryPool/real_time/threads:4 103 ns 103 ns 6478104 BM_CustomMemoryPool/real_time/threads:8 124 ns 124 ns 5629344 BM_CustomMemoryPool/real_time/threads:16 157 ns 157 ns 4198080 BM_SystemMalloc/real_time/threads:1 502 ns 502 ns 1000000 BM_SystemMalloc/real_time/threads:2 510 ns 510 ns 1322608 BM_SystemMalloc/real_time/threads:4 529 ns 529 ns 1264884 BM_SystemMalloc/real_time/threads:8 607 ns 607 ns 1145336 BM_SystemMalloc/real_time/threads:16 757 ns 756 ns 932192 root@LAPTOP-CEH85GLR:/home/requiem/pool/cppMemoryPool#
引入 线程本地缓存(Thread-Local Free List, TLFL) 机制:每个线程维护一个小型本地空闲块缓存,优先从本地分配/回收,显著减少对 Per-Page 锁的竞争
在相同测试负载下,相比 v2.0.0 的纯 Per-Page Locking 实现,性能全面提升约 12倍。
指标 Per-Page Locking (v2.0.0) TLFL 优化 (v2.3.1) 提升幅度 Block size 64 bytes 64 bytes — Blocks per page 1024 1024 — Threads 16 16 — Total ops 3,200,000 3,200,000 — Wall-clock time 25.482891 s 2.014811 ∼12.56× 加速 Max thread time 25.479204 s 2.003030 ∼12.72× 加速 Throughput 0.13 M ops/s 1.59 M ops/s ∼12.23× 提升 Avg latency 7963.40 ns/op 629.63 ns/op ∼12.65× 降低
代码量增加,实现了份文件编写,提高一下可读性
引入 惰性回收机制:当内存池中空闲页比例超过 20% 阈值时,自动将完全空闲的内存页归还给系统,降低内存占用。 回收过程在后台安全执行,不影响正在进行的 allocate/deallocate 操作
内存页释放策略由“永不释放”调整为“按需惰性回收”,提升了长期运行场景下的内存效率。
在长时间运行、分配模式波动较大的负载下,惰性回收机制可以降低内存池的占用
- 实现 “一页一锁”(Per-Page Locking) 并发控制机制
- 引入 活跃操作计数器与安全析构机制,确保内存池在多线程环境下析构时不会访问已释放资源 重构内存页(Page)生命周期管理:将底层内存块(base)的释放逻辑移至 Page 析构函数,保证 Page 对象与其管理的内存同生命周期。
内存池内部锁粒度从 全局单锁 细化为 每页独立互斥锁,减少线程竞争。 FixedSizeMemory 析构行为变更:现在会等待所有活跃的 allocate/deallocate 操作完成后才释放资源,保证线程安全。
通过一页是一所 在 16 线程高并发压力测试下,吞吐量相比 v1.1.0 提升 3–5 倍 显著了降低延迟
Safe Benchmark: Per-Page Locking Memory Pool Block size : 64 bytes Blocks per page: 1024 Threads : 16 Ops per thread : 200000 (alloc + dealloc) Total ops : 3200000
Wall-clock time : 25.482891 s Max thread time : 25.479204 s Throughput : 0.13 M ops/s Avg latency : 7963.40 ns/op
- 为内存池所有成员函数加互斥锁,支持高并发场景。
- 对内存池在多线程场景下的线程安全进行了测试
[TEST5] 线程安全测试... 总耗时: 62 ms 内存块大小: 64 bytes 每页内存块数量: 1024 总页数: 4 当前已分配内存块数: 0 当前空闲内存块数: 4096 ✓ 多线程测试通过:所有内存块均已正确释放!
执行单线程功能验证... ✓ 单线程功能验证通过!
线程安全测试总结:
- 并发线程数: 8
- 每线程操作次数: 10000(混合分配/释放)
- 总操作次数: 80000
- 内存池最终状态: 干净(无泄漏)
- 测试结果: PASS
- 定长内存池第一版,支持
allocate/deallocate。 - 对内存池的基本功能进行了测试
- 对内存池的边界处理进行了测试
- 测试内存池与
malloc/free的性能差距。 - 测试了内存池的空间性能,RSS等数据
[TEST1] 基本功能校验... 基本功能校验通过 ✔
[TEST2] 性能对比 (1000 次 alloc+free) memory_pool 耗时: 0.39 ms malloc/free 耗时: 10.20 ms 加速比: 26.44x
[TEST3] 空间性能测试 请求块大小: 60 B 对齐后块大小: 64 B 元数据/块: 8 B 每页块数: 1024 每页字节: 65536 B (64.00 KiB) 内部碎片率: 6.25% 元数据比例: 12.50% 分配后RSS增量: 0.00 KiB 每MiB可管理对象: 95528632.03 个 随机释放再分配后RSS增量: 0 KiB (0 表示无外部碎片) 空间体检完成 ✔
[TEST4] 边界场景... 1 字节块 通过 ✔ 空指针回收 通过 ✔