我做了一個測試,看看從單個字節數組寫入磁盤上的1GB文件所需的時間與從1024個數組寫入另一個1GB文件(每個1MB)之間是否存在差異。爲什麼寫一個小字節數組到一個文件比寫一個大數組要快?
試寫很多陣列
331.6902毫秒
考試中的寫作大陣
14756.7559毫秒
在這個測試中,「多陣列」實際上是一個byte[1024 * 1024]
陣列我寫1024次使用for循環。 「大數組」只是一個填充隨機值的1GB字節數組。
下面的代碼是什麼樣子:
Console.WriteLine("Test Writing many arrays");
byte[] data = new byte[1048576];
for (int i = 0; i < 1048576; i++)
data[i] = (byte)(i % 255);
FileStream file = new FileStream("test.txt", FileMode.Create);
sw1.Restart();
for (int i = 0; i < 1024; i++)
file.Write(data, 0, 1048576);
file.Close();
sw1.Stop();
s1 = sw1.Elapsed;
Console.WriteLine(s1.TotalMilliseconds);
Console.WriteLine("Test Writing big array");
byte[] data2 = new byte[1073741824];
for (int i = 0; i < 1073741824; i++)
data2[i] = (byte)(i % 255);
FileStream file2 = new FileStream("test2.txt", FileMode.Create);
sw1.Restart();
file2.Write(data2, 0, 1073741824);
file2.Close();
sw1.Stop();
s1 = sw1.Elapsed;
Console.WriteLine(s1.TotalMilliseconds);
我包括定時部內的file.Close()
,因爲它會調用Flush()
法和流寫入到磁盤。
生成的文件尺寸完全相同。
我也許C#可以看到,我總是使用相同的數組,它可能會優化迭代/寫入過程,但結果不是它的2-3倍,它快了大約45倍......爲什麼?
我懷疑這不是寫內存的部分,而是關於導致問題的臨時存儲(即1MB內存),導致硬盤從虛擬內存交換。 – Matthew 2012-07-11 15:02:54
另一件事是緩存命中/未命中:你將有緩存命中1MB的內存,始終保持相同。不過,這不是頁面交換的問題。 – nhahtdh 2012-07-11 15:03:32
這也不是一個公平的比較,是嗎?你沒有關閉小陣列1000次,只有一次。 – Rotem 2012-07-11 15:03:59