前言:我之所以问这个问题,是因为我没有一个环境(足够大的数据集+计算能力)来以可靠的方式测试它。
问:给定一个加载了数十亿项的Concurrent Bag,由单个线程访问/使用,它的性能是否类似于列表(换句话说,https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110%29.aspx)?是Concurrent Bag
上的枚举,其性能是否高于List<T>
上的枚举
发布于 2019-07-27 00:37:24
但是,如果需要删除项,ConcurrentBag的速度要比列表快得多
void Main()
{
ConcurrentBag<int> bag = new ConcurrentBag<int>();
ConcurrentStack<int> stack = new ConcurrentStack<int>();
ConcurrentQueue<int> q = new ConcurrentQueue<int>();
List<int> list = new List<int>();
Stopwatch sw = new Stopwatch();
int count = 100000;
sw.Start();
for (int i = 0; i < count; i++)
{
bag.Add(i);
}
for (int i = 0; i< count; i++)
{
bag.TryTake(out _);
}
sw.Elapsed.Dump("BAG");
sw.Start();
for (int i = 0; i < count; i++)
{
stack.Push(i);
}
for (int i = 0; i < count; i++)
{
stack.TryPop(out _);
}
sw.Elapsed.Dump("Stack");
sw.Start();
for (int i = 0; i < count; i++)
{
q.Enqueue(i);
}
for (int i = 0; i < count; i++)
{
q.TryDequeue(out _);
}
sw.Elapsed.Dump("Q");
sw.Start();
for (int i = 0; i < count; i++)
{
list.Add(i);
}
for (int i = 0; i < count; i++)
{
list.RemoveAt(0);
}
sw.Elapsed.Dump("list remove at 0");
sw.Start();
for (int i = 0; i < count; i++)
{
list.Add(i);
}
for (int i = 0; i < count; i++)
{
list.RemoveAt(list.Count -1);
}
sw.Elapsed.Dump("list remove at end");
}
结果:
BAG 00:00:00.0144421
堆栈 00:00:00.0341379
Q 00:00:00.0400114
在0 00:00:00.6188329删除列表
在end 00:00:00.6202170删除列表
https://stackoverflow.com/questions/35416565
复制相似问题