我的财务软件不断地处理几乎相同的对象。例如我在网上有这样的数据:
HP 100 1
HP 100 2
HP 100.1 1
etc.
我每秒大约有 1000 次更新。
每个更新都存储在对象中 - 但我不想动态分配这些对象以改善延迟。我只在短时间内使用对象 - 我收到它们,申请和免费。一旦对象是空闲的,它实际上可以被重新用于另一包数据。
所以我需要一些存储(可能是环形缓冲区)来分配所需数量的对象一次,它们允许“获取”和“释放”它们。在 c# 中做到这一点的最佳方法是什么?
每个对象都有,我也按顺序id
分配并释放它们。例如,我收到 id和,然后我免费, , 。所以任何 FIFO 集合都可以工作,但我正在寻找一些涵盖所需功能的库类。id's
sequentially
1
2
3
1
2
3
即我需要不分配对象但重用它们并允许重新配置它们的 FIFO 集合。
更新
我已经添加了我想要的实现。这不是经过测试的代码,可能有错误。想法很简单。作家应该调用Obtain
Commit
方法。读者应该调用TryGet
方法。Reader 和 writer 可以从不同的线程访问这个结构:
public sealed class ArrayPool<T> where T : class
{
readonly T[] array;
private readonly uint MASK;
private volatile uint curWriteNum;
private volatile uint curReadNum;
public ArrayPool(uint length = 1024) // length must be power of 2
{
if (length <= 0) throw new ArgumentOutOfRangeException("length");
array = new T[length];
MASK = length - 1;
}
/// <summary>
/// TryGet() itself is not thread safe and should be called from one thread.
/// However TryGet() and Obtain/Commit can be called from different threads
/// </summary>
/// <returns></returns>
public T TryGet()
{
if (curReadNum == curWriteNum)
{
return null;
}
T result = array[curReadNum & MASK];
curReadNum++;
return result;
}
public T Obtain()
{
return array[curWriteNum & MASK];
}
public void Commit()
{
curWriteNum++;
}
}
欢迎对我的实现发表评论,并且可能一些库方法可以替换这个简单的类?