2010-06-29 123 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