读取C#或C+中的二进制文件+;

读取C#或C+中的二进制文件+;,c#,c++,binaryfiles,C#,C++,Binaryfiles,我必须将二进制文件数据读入C#winform应用程序 二进制读取是频繁的,即许多表单读取数据的不同部分 我可以创建一个C++ DLL来读取二进制文件并在C语言应用程序中使用它。 或 我可以用C#来理解阅读逻辑 主要问题是性能 。C语言作为一种语言并不像C++那样慢得多(特别是因为它很容易在C++中以英尺的形式向你自己射击),你可以得到整个.NET框架,它对大多数事物都有足够的性能解决方案。(我猜流式读写器类会做更多的缓冲,然后你会自动进入C++,这会在性能上产生很大的差异)。 一般来说,这似乎是

我必须将二进制文件数据读入C#winform应用程序

二进制读取是频繁的,即许多表单读取数据的不同部分

我可以创建一个C++ DLL来读取二进制文件并在C语言应用程序中使用它。 或

我可以用C#来理解阅读逻辑

主要问题是性能

<如果我把它写进C,它会给我像C++一样的照明速度。
<>如果我使用C++,每次C应用程序都会通过接口调用它,那么整体速度将是相同的。

你的瓶颈不应该是代码,而是HDD访问,所以你使用哪种语言不重要。根据你的经验(以及你想投入的工作量),在C语言中这样做完全有可能在C++中做得很快。<强>完全< /强>。C语言作为一种语言并不像C++那样慢得多(特别是因为它很容易在C++中以英尺的形式向你自己射击),你可以得到整个.NET框架,它对大多数事物都有足够的性能解决方案。(我猜流式读写器类会做更多的缓冲,然后你会自动进入C++,这会在性能上产生很大的差异)。


一般来说,这似乎是一个可能过早优化的案例,正如我们所知,这是邪恶的。这一部分真的是性能敏感吗?我猜不是(当然,我可能错了)。如果是,语言会有所不同吗?可能不会(比较执行您编写的指令所需的时间)(一些算法,一些函数调用)以典型hdd的毫秒寻道时间读取文件(可能以纳秒或微秒为单位)。如果您的代码可以在这方面发挥作用,则很可能只是访问模式和缓冲量。例如,一次读取较大的数据块可能更好(即使你不需要一些数据)一次进入内存,如果这减少了读访问的次数(并且特别地寻找),但是再次写它是显而易见的方式,并且只有在必要时才优化。

< P>从磁盘读取的大多是I/O绑定操作,所以如果你用C或C++写的话,它将不会有什么差别。 为了最大限度地提高性能,我建议一次性将整个文件读入内存(假设文件不太大),而不是在文件中前后搜索以读取不同的部分。

在C#中,您可以使用,此代码在性能意义上是相同的(或稍微慢一点)

在.NET4中还添加了允许您将大型文件直接映射到内存中,并且仍然使用安全的.NET方法

最后一句话:您可以自己使用(再次)p/Invoke在C#中创建文件映射


<> P> >结论是:你可以不用担心就用C来代替你的应用程序。

C++是更快的,但在读取文件时不是很好。用C++来做这件事,不会有什么区别。……澄清:C++有更快的速度,但是写得好的C代码往往比写得好的/优化的C++代码好,所以速度问题也不是这样。容易回答的是,我决定在C语言中编写代码,因为C++中有更多的风险。我们现在不使用.NET 4,所以不能使用幼珍所建议的MyMyMyDoufffile类。我不能一次读取文件,因为它将是大的,每次我必须去一个特定的偏移量和读取4属性值,所以它的速度总是可以计算出W。我想在这里读一读。