C# 如果I';我不是在收集垃圾吗?

C# 如果I';我不是在收集垃圾吗?,c#,performance,garbage-collection,clrprofiler,C#,Performance,Garbage Collection,Clrprofiler,我正在编写一个数据结构,如果我在app.config文件中设置,程序将在200毫秒内添加500000项。如果我设置,则需要300毫秒。也就是说,将此标志设置为false会使持续时间延长50%,这是由秒表测量的 我想知道为什么这是因为我没有做任何垃圾收集。我知道有时会自动完成,但在使用CLRProfiler分析后,我可以确认正在发生0个集合: 有人知道为什么会这样吗?如果垃圾收集器甚至没有运行,那么为什么服务器垃圾收集器的速度会快得多?下面是我检查速度差异的代码: Stopwatch sw =

我正在编写一个数据结构,如果我在
app.config
文件中设置
,程序将在200毫秒内添加500000项。如果我设置
,则需要300毫秒。也就是说,将此标志设置为false会使持续时间延长50%,这是由
秒表测量的

我想知道为什么这是因为我没有做任何垃圾收集。我知道有时会自动完成,但在使用CLRProfiler分析后,我可以确认正在发生0个集合:

有人知道为什么会这样吗?如果垃圾收集器甚至没有运行,那么为什么服务器垃圾收集器的速度会快得多?下面是我检查速度差异的代码:

Stopwatch sw = Stopwatch.StartNew();

foreach (string s in items)
{
    dataStructure.Add(s, s + "a");
}

sw.Stop();

这里有五件事我需要说明

首先,要理解这个标志并不会打开或关闭垃圾收集器,而只是决定它使用哪种模式。两个示例都启用了垃圾收集;只有第一个(较慢的)示例使用了服务器垃圾回收

第二,仅仅因为没有执行收集,这并不意味着GC从未停止检查是否需要运行收集

三是:

对于单处理器计算机,默认工作站垃圾收集应该是最快的选项

第四,在上述上下文中理解“单处理器”实际上是指处理器,而不是核心

将所有这些放在一起,问题的行为与文档完全匹配。向前走;这里没什么可看的


第五点,也是最后一点,是了解服务器负载与桌面负载的区别。服务器系统中最重要的是稳定性。即使在表现上也是如此;如果系统一直崩溃,性能并不重要。此外,服务器更有可能运行进程寿命较长的工作负载。。。即使一次几个月或几年都没有重新启动。因此,服务器管理员可能会牺牲一些性能,以获得运行频率更高、运行更完整检查的GC,这可能包括内存压缩以回收地址空间,这样就避免了OutOfMemoryException的问题,否则可能会在长期运行的.Net应用程序中导致问题。

仅仅因为您没有收集任何对象,并不意味着GC算法没有运行&试图在图形中找到它可以收集的对象。也许这篇论文会对这些差异有所启发;为什么当我做
GCSettings.LatencyMode=GCLatencyMode.LowLatency
在启动秒表之前,它需要600毫秒吗?只要问一下;您是否在发布模式下运行&未连接调试程序?(Ctrl+F5)是的,我确信每次在发布模式下都会执行Ctrl+F5。