我正在研究一些需要非常低的延遲並推送大量內存的應用程序,並正在對一些應用程序進行測試。分配一個列表ad-hoc與預分配和清除列表執行。 我期待測試運行時預分配內存的執行速度要快得多,但令我驚訝的是它們實際上稍慢(當我讓測試運行10分鐘時,平均差異大約爲400ms)。.NET預分配內存vs臨時分配
下面是測試代碼,我用:
class Program
{
private static byte[] buffer = new byte[50];
private static List<byte[]> preAlloctedList = new List<byte[]>(500);
static void Main(string[] args)
{
for (int k = 0; k < 5; k++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
List<byte[]> list = new List<byte[]>(300);
for (int j = 0; j < 300; j++)
{
list.Add(buffer);
}
}
sw.Stop();
Console.WriteLine("#1: " + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
for (int j = 0; j < 300; j++)
{
preAlloctedList.Add(buffer);
}
preAlloctedList.Clear();
}
sw.Stop();
Console.WriteLine("#2: " + sw.Elapsed);
}
Console.ReadLine();
}
}
現在,什麼是真正有趣的,我跑並排性能監視器側,看到下面的圖案看起來像我的預期:
綠色=第0級集合
藍色=分配的字節/秒
紅色=%在GC時間
下面的控制檯應用程序顯示#1和試驗運行時#2
所以,我的問題是,爲什麼測試#1比#2更快?
顯然,我寧願在我的應用程序中測試#2的perfmon統計數據,因爲基本上沒有內存壓力,沒有GC集合等,但#1似乎稍快一點?
List.Clear()會帶來多大的開銷嗎?
感謝,
湯姆
編輯 我做了另外一個測試,用相同的設置,但運行與服務器GC的應用啓用,目前#2變稍快
非常感謝您的回覆。你會選擇哪一個選項,但在非常相似的生產場景中?現在,有趣的是,當我啓用服務器GC運行相同的應用程序時,#2實際上變得更快。我更新了這篇文章,並附上截圖 – TJF 2010-10-20 19:37:29
@Tom:服務器模式以更高的延遲爲代價提高了整體吞吐量。哪個更好取決於你。話雖如此,我通常只在我的生產環境中使用#1 - 代碼更乾淨,而且它的整體性能更好。 – 2010-10-20 20:01:21