用C#或C ++读取二进制文件

时间:2010-07-30 12:00:49

标签: c# c++ binaryfiles

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

二进制读取是频繁的,即许多形式读取不同的数据部分。

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

我可以在C#中使用读取逻辑。

表现的主要问题。

如果我把它写进C#,它会给我C ++的照明速度。

如果我使用C ++,每次C#应用程序通过接口调用它时,整体速度都会相同。

3 个答案:

答案 0 :(得分:1)

从磁盘读取主要是一个I / O绑定操作,因此如果用C#或C ++编写它将没什么区别。

为了最大限度地提高性能,我建议一次性将整个文件读入内存(假设文件不是太大),而不是在文件中向后和向前搜索以读取不同的部分。

答案 1 :(得分:0)

你的瓶颈不应该是代码,而应该是hdd访问,所以你使用哪种语言并不重要。根据您的经验(以及您想要投入的工作量),完全有可能在c#中执行此操作比在c ++中执行完全要快得多。 C#作为一种语言并不比c ++慢得多(特别是因为它很容易在c ++中用脚在性能上拍摄)并且你获得了整个.net框架,它具有性能方面适用于大多数事物的解决方案(我猜想streamreader类做了一些缓冲,然后你会自动进入c ++,这可以在性能上产生很大的不同)。

总的来说,这似乎是一种可能过早优化的情况,正如我们所知道的那样是邪恶的。这个部分真的那么表现敏感吗?我猜不会(当然,我可能错了)。如果是的话,语言会有所作为吗?可能不是(比较执行你编写的指令所需的时间(一些算术,一些函数调用)来读取文件(可能以纳秒或微秒为单位),以及典型硬盘的毫秒寻道时间。如果你的代码可以制作一个不同的是,它最有可能只在访问模式和缓冲量。例如,一次读取更大的块(即使你不需要一些数据)可能会更好地进入内存,如果这样减少读取访问的次数(特别是寻求访问)。但是再次以明显的方式编写它,并且只在必要时进行优化

答案 2 :(得分:0)

在C#中,您可以使用WinAPI File Management Functions through P/Invoket,这段代码在性能含义上会相同(或稍慢)。

同样在.NET 4中添加了MemoryMappedFile class,它允许您将大文件直接映射到内存中,并仍然使用安全的.NET方法。

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

所以结论是:你可以在没有疑虑的情况下使用C#。