2015-02-06 23 views
0

請原諒我的英文不好。XmlReader(Stream(fileName) - > MemoryStream)比XmlReader(文件名)慢

我想讀取大型XML文件(> 2GB)。我看到了幾篇關於它的文章,並想出使用XmlReader。

出於測試目的,我創建了一個500MB的XML,使2代碼:

第一招:

MemoryStream mem = new MemoryStream(); 
Stream file = File.OpenRead(ofd.FileName); 
file.CopyTo(mem); 
mem.Position = 0; 
file.Close(); 
XmlReader reader = XmlReader.Create(mem); 
// work with reader 

第二個:

XmlReader reader = XmlReader.Create(ofd.FileName); 
// work with reader 

ofd.FileName:是名稱xml文件的路徑。

與讀者一起工作:在兩種算法中是一樣的。

我的RAM的速度是:15GB /秒 我的SSD的速度是:150MB /秒

我認爲第一算法將是至少100個時間更快。但實際上,第二種算法更快。

第一算法持續時間:10500毫秒。

第二算法持續時間:9500毫秒。

爲什麼?是否因爲程序應該跨越第一個算法中的多個抽象層?

謝謝你的任何信息。

+1

您沒有顯示足夠的關於基準測試的信息。一秒鐘或10%的差異很可能是JITter熱身。執行一個適當的基準,你可能會看到他們的表現平等。 – CodeCaster 2015-02-06 09:52:13

+1

你在第一種情況下測量什麼? (它是否包括文件的讀取,或者不包括?)如果它包括讀取文件所花費的時間,爲什麼你會期望它「至少快100倍」? – 2015-02-06 09:52:22

+0

@CodeCaster:var watch = Stopwatch.StartNew();算法之前 And: watch.Stop(); Console.WriteLine(watch.ElapsedMilliseconds); 之後算法 – steacker 2015-02-06 09:56:54

回答

1

XmlReader是一款只讀閱讀器,因此使用MemoryStream方法時,您只需瀏覽整個文件兩次。

儘管第二次運行直接來自內存,但在預緩衝時已經有「磁盤」損失,所以開銷只是再次運行所有數據。

+0

你是對的,我忘記了在第一種情況下,它讀取文件兩次。 copyTo需要1500毫秒。 – steacker 2015-02-06 10:05:02

+0

如果copyTo需要1500毫秒,則表示「與讀卡器一起工作」需要9000毫秒。 所以它比第二個算法快一點。 現在它更有意義。 但是它不應該更快? – steacker 2015-02-06 10:07:52

+0

@ steacker操作系統在預緩衝文件數據方面相當出色,但我不確切知道引擎蓋下會發生什麼。如果操作系統決定將文件數據保存在內存中,則一項測試甚至可能會影響另一項測試。 – 2015-02-06 10:18:00