2010-07-30 72 views
2

我必須將二進制文件數據讀入C#winform應用程序。用C#或C++讀取二進制文件

二進制讀取頻繁,即許多形式讀取不同的數據部分。

我可以創建一個C++ DLL來讀取二進制文件並在C#應用程序中使用它。

我可以在C#中具有讀取邏輯。

如果表現的主要問題。

如果我將它寫入C#,它會給我C++的照明速度。

如果我使用C++,並且每次C#應用程序通過接口調用它,總體速度將是相同的。

+0

C + +速度更快,但並不真正在閱讀文件恕我直言。使用C#來做到這一點,不會有分歧.. – 2010-07-30 12:11:42

+0

只是爲了澄清:C++有可能會更快,但編寫良好的C#代碼通常會勝過寫得不好的/優化的C++代碼,所以即使速度問題也不容易回答 – Grizzly 2010-07-30 12:22:14

回答

1

從磁盤讀取大部分是I/O限制操作,所以如果你寫它在C#或C++中。

爲了最大限度提高性能,我會建議手勢將整個文件一次讀入內存(假設文件不是太大),而不是在文件中向後和向前搜索以讀取不同的部分。

+0

我決定用C#編寫代碼因爲C++有更多的風險。我們現在不使用.NET 4,因此不能像Eugene所建議的那樣使用MemoryMappedFile類。 我無法一次讀取文件,因爲它會很大,每次我必須去一個特定的偏移量,並讀取4個屬性值,所以它的速度很快,因爲我總是可以計算出我想要讀取的位置。 – Mohit 2010-08-20 06:39:24

0

您的瓶頸不應該是代碼,而是硬盤驅動器訪問,因此使用哪種語言並不重要。根據你的經驗(以及你想要投入的工作量),在c#中完成這項工作可能完全有可能比用C++完成完全是快得多。 C#作爲一種語言的速度並不比C++慢很多(特別是因爲在C++中用腳來表現非常容易),並且你會得到整個.net框架,它在大多數情況下都具有性能上足夠的解決方案(我猜測streamreader類會做更多的緩衝,然後你會自動獲得C++,這可以在性能上有所不同)。

一般來說,這似乎是一個可能過早優化的情況,正如我們所知道的那樣,它是邪惡的。這部分真的是性能敏感嗎?我想不會(當然,我可能是錯的)。如果是這樣,語言會有所作爲嗎?可能不會(比較執行你所寫的指令(一些算術函數,某些函數調用)來讀取文件所需的時間(可能以納秒或微秒爲單位),以毫秒爲單位尋找典型硬盤的時間。不同的地方,它很可能只在訪問模式和緩衝數量方面有所不同,例如,一次讀取更大的塊(即使不需要某些數據)可能會立即讀入內存,如果這樣減少讀訪問的次數(並且特別尋求)但是再次寫它明顯的方式並且只在必要時才進行優化

0

在C#中,您可能會使用WinAPI File Management Functions through P/Invoket,並且此代碼在性能含義上會相同(或稍慢)。

也在.NET 4中添加了MemoryMappedFile class,它允許您將大文件直接映射到內存中,並仍然使用安全的.NET方法。您可以使用(再一次)P/Invoke自己在C#中創建文件映射。

所以得出的結論是:您可以使用C#作爲您的應用程序而不會感到疑慮。