现在的位置: 首页 > 综合 > 正文

头疼的VC.NET的效率问题

2012年10月30日 ⁄ 综合 ⁄ 共 3242字 ⁄ 字号 评论关闭

      前几天用2008编写了一个文件的读取过程。文件格式是S-57标准的海图数据。借用了网上现成的Parse57中的文件格式分解读取模块。然后将内容读取后记录到自己的SENC数据结构中。代码并不是很麻烦,关键是,常常屏幕中同时需要显示几幅海图,才能将屏幕填满;而且除了读取SENC海图数据外,还需要进行海图要素的显示,以及海图上层功能的显示。因此,数据处理的速度是个很重要的问题。如果速度慢,那么功能再强大,也是无法接受的。

      将S-57数据解析后记录到内存的SENC数据结构的部分,在2008的debug下需要9秒,不过这个到不重要,因为海图系统运行的时候,只是从SENC中读取数据,不会直接读取S-57数据文件。形成的SENC数据,我测试了一个S-57文件大小为3.6M的形成的SENC数据,大约需要650毫秒,这还是我反复简化的结果,其中去掉了CString的使用,都是用指针和内存拷贝函数来实现文件的读取,而且用了内存映射文件。这样做,大大损失了我的数据结构的灵活性和封装性,丢失了对S-57数据协议中一部分协议的支持,而且扩展性也降低了,万一以后S-57数据的某个我目前忽略的项突然起作用了,那么可能会产生很大的影响。不过没办法,如果不这么做,那么连现在的系统都无从谈起。可650毫秒显然还是难以接受的结果。

      那么, 我又在release下编译运行,经过测试,速度也在400毫秒左右,虽然有所提高,但如果需要同时读取三幅海图,那么就需要1秒左右,这个效率还是很困难。

      踌躇之间,我把该模块转到VC6下运行。这个过程,我可以说是没有调整任何代码,因为模块已经封装好,外部调用函数也是一致的。测试发现,将S-57数据读取到内存SENC数据结构中,只需要4.5秒(debug下),SENC文件的读取速度与2008倒是差不多,600毫秒左右。我又用release编译运行,结果SENC文件的读取速度只需要200毫秒左右。这个速度就好多了。

      为什么差距这么大呢?哪位有经验不吝赐教啊。如何才能提高2008下的速度呢?

      以下是部分代码,还请大家给点建议:

抱歉!评论已关闭.