我的程序遇到了一个问题,即在处理大量数据后,它会继续使用比平常更多的CPU。我将问题追溯到一段代码,该代码枚举ConcurrentDictionary
。
我知道这会在枚举字典时导致CPU使用率过高而它拥有数百万个条目,但是当CPU使用率没有下降到字典后的原始级别时,我引起了人们的注意。已经倒空了。在大规模添加 - 然后删除之后,似乎字典在幕后做了很多工作,但为什么呢?在添加任何内容之前枚举字典时,CPU使用率保持在0%。
为什么会这样?我能做些什么来阻止它发生吗?
这是一个重现问题的代码段:
var dict = new ConcurrentDictionary<string, object>();
const int count = 3000000; // High CPU.
//const int count = 100; // No issues.
for (int i = 0; i < count; i++)
{
dict.TryAdd(i.ToString(), null); // Add lots of entries.
}
for (int i = 0; i < count; i++)
{
object nullObj;
dict.TryRemove(i.ToString(), out nullObj); // Then remove them all.
}
GC.Collect();
Debug.Assert(dict.IsEmpty);
Console.WriteLine("Enumerating");
while (true)
{
// Enumerate the dictionary. Takes up lots of CPU despite being empty,
// but only if lots of entries were added then removed.
foreach (var kvp in dict) { /* Empty. */ }
Thread.Sleep(50);
}