我不确定我在测试中是否做错了什么,但从我的结果来看,MemoryPool始终比ArrayPool慢,并且分配的内存更多,因为你可以将Array类型转换为Memory,那使用MemoryPool的意义是什么呢?
using System.Buffers;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Attributes;
BenchmarkRunner.Run<test>();
[MemoryDiagnoser]
public class test
{
[Benchmark]
public void WithArrayPool()
{
ArrayPool<int> pool = ArrayPool<int>.Shared;
for (int z = 0; z < 100; z++)
{
var memory = pool.Rent(2347);
for (int i = 0; i < memory.Length; i++)
{
memory[i] = i + 1;
}
int total = 0;
for (int i = 0; i < memory.Length; i++)
{
total += memory[i];
}
pool.Return(memory);
}
}
[Benchmark]
public void WithMemoryPool()
{
MemoryPool<int> pool = MemoryPool<int>.Shared;
for (int z = 0; z < 100; z++)
{
var rentedArray = pool.Rent(2347);
var memory = rentedArray.Memory;
for (int i = 0; i < memory.Length; i++)
{
memory.Span[i] = i + 1;
}
int total = 0;
for (int i = 0; i < memory.Length; i++)
{
total += memory.Span[i];
}
rentedArray.Dispose();
}
}
}
方法 | 平均时间 | 误差 | 标准偏差 | 分配空间 |
---|---|---|---|---|
使用数组池 | 770.2微秒 | 2.27微秒 | 2.01微秒 | 1字节 |
使用内存池 | 1,714.6微秒 | 0.56微秒 | 0.50微秒 | 2,402字节 |
以上是我的测试代码及结果。内存池在一般情况下是否真的慢一些,或者我遗漏了什么?如果内存池确实更慢,那么它适用于哪些场景?
谢谢。