2010-06-29 151 views
1

我有一個很大的二進制文件來解析,並且我不確定要使用哪種語言來提高性能。最初,我打算使用C#WPF作爲GUI,並使用c DLL來進行解析。但我的目標PC是64位機器。並且我在VS 2008中設置了一個c DLL項目時遇到了麻煩。所以我想如果我應該移動到C++或c#來執行解析。我只是不確定C++/C#的文件讀取速度,因爲我的文件非常大。速度非常關鍵。任何人都可以給我一些建議嗎? 謝謝。二進制文件解析:性能

+0

該語言幾乎沒有區別...... – 2010-06-29 01:15:19

+1

......這被稱爲不必要的/過早的優化 – 2010-06-29 01:15:48

+0

考慮到您列出的所有語言只是調用操作系統來執行文件I/O。 – 2010-06-29 01:18:13

回答

3

而不是專注於語言(其他人已經提到過,其效果不大),重點放在方法上。

一般來說,我建議使用文件映射(可在.NET 4.0中的新MemoryMappedFile類中使用)。這是很好的,除非你正在進行單向掃描,只能使用正向流掃描。

有一些提示,非託管代碼可以傳遞給未在.NET中公開的文件打開例程(具體來說,通知緩存管理器您將隨機或按順序訪問文件)。但是,這些缺乏可能不會給您帶來明顯的性能影響。

3

選擇你編寫程序其餘部分的任何語言。啓動文件流並讀取吸盤。

無論您使用的代碼如何,它仍然會在磁盤上等待數據到達任何地方。

0

既然你是windows,由於出色的Overlapped IO API,生活比其他平臺更容易一些。如果你真的試圖壓縮性能,這就是你想要使用的。重疊的IO允許IO不按順序發生。你會注意到FileStream實際上使用了重疊的IO。如果你可以在其限制內工作,那麼就使用它。否則,請創建一個託管C++包裝器,以使用ReadFile爲您讀取數據。

這是正確方法的原因是磁盤IO應該是程序最慢的部分。如果沒有其他訪問磁盤的情況下使用重疊IO,您應該能夠接近磁盤實際的吞吐量限制。解碼成數據結構應該是微不足道的。如果不是,你應該重新審視你如何解析數據。

+0

我同意重疊的I/O是好的(第二個文件映射),但爲了得到一個重疊的'FileStream',你*有*使用一個帶有布爾'async'參數並傳遞'true'的構造函數。 'File.Open',et。人。不要使用重疊的I/O。 – 2010-06-29 02:22:19

+0

我會問一些我認識的人,但我懷疑mem映射文件在引擎蓋下使用了重疊的I/O。 – 2010-06-29 15:09:48

+0

否;內存映射文件是一種非常不同的方法。 [Windows Internals](http://tinyurl.com/23seaj8)詳細介紹了各種I/O方法的工作原理。 – 2010-06-29 16:06:45