大家好:
我在自己的程序中自定义了几个CLIST类型的链表,但是使用中发现对其的数据读写有点慢。
我是相对于JAVA代码来说的,因为原本的代码是用JAVA写的,现在改用C++,数据的读写过程完全一模一样,
就是数据的容器也都是链表,但是C++中就慢了很多。
请问用过STL的朋友对这个的评价怎么样?
我还用到了他的MAP结构,一般都是用遍历器遍历的,写入数据的时候用push_back函数。
我在自己的程序中自定义了几个CLIST类型的链表,但是使用中发现对其的数据读写有点慢。
我是相对于JAVA代码来说的,因为原本的代码是用JAVA写的,现在改用C++,数据的读写过程完全一模一样,
就是数据的容器也都是链表,但是C++中就慢了很多。
请问用过STL的朋友对这个的评价怎么样?
我还用到了他的MAP结构,一般都是用遍历器遍历的,写入数据的时候用push_back函数。
1. CLIST不属于STL
2.容器类的效率由使用者的使用方式决定,不当的使用方式无论哪种容器都快不了。
你应该根据你的需要来使用对应的类型库等...
优化代码效率必须要综合考虑系统平台、语言、算法、以及实现。两种语言的编译器对看起来一样的代码处理方式和优化仍然是可能不一样的。关于优化方案:
楼主你提的问题别人很难回答,原因在于优化方案都是针对具体案例的。
如果楼主不愿详述,建议你下载个Performace的检查工具,比如说BoundsChecker,对性能瓶颈的函数进行优化。 另外VC有两种模式Debug和Release,其中Debug不对代码进行优化,所以你用Debug版和Java的进行比较是没有意义的。
我是在做电子海图的绘制。从海图文件中读取数据然后绘制成图像在屏幕上。
比如绘制一条线吧。
1.把海图文件读入内存,所有数据在一个名为ENC的结构中。(这一步只执行一次,无关效率)
2.根据要绘制的线段的键值在上面的ENC中取出线段的坐标数据(一系列的地理坐标点的数据),保存在一个list结构中。(这个list就是我上面说的怀疑速度慢的list,属于STL库);
3.根据自己建立的坐标系把上面的线段的list中的地理坐标转化为屏幕坐标,保存为CDC中的路径或者一个点数组,路径的话就可以使用绘制路径的方法绘制,数组可以使用polyline绘制。但是这个转化的过程自然设计对list的遍历,这也是满的另一个地方
4,绘制。这一过程都是CDC的函数,如果有数据的话应该不会是效率瓶颈。
所以总结下来我就觉得是list的读写过程占据了大部分时间。
相比于JAVA中的数据读写,使用的是JAVA中的数据结构保存,就慢很多。我想知道是不是我选择的容器list处理自定义结构数据本来就很慢的原因。
还有ENC结构其实是一个MAP结构,也是STL中的,第二步中其实包括了数据的读取和数据的写入两个过程!都是涉及STL中的机结构的数据读取。
1.从ENC中取数据
2.对list的遍历,和转化坐标
3.绘制这几个地方应该用代码输出时间差进行判断,(比如说GetTickCount的差值)1.从ENC中取数据,从你的说法看来是用了map进行查找,如果key设置合理的话,初步估计是瓶颈的可能性不大2.对list的处理,list的增加和删除值效率很高的,基本不会是瓶颈,但是如果把它做随机访问的话,效率就很低了。还有就是其size函数不能随便用,list越大,该函数效率越低。3.绘制,实际上DC函数的操作速度远比内存操作慢,如果次数少的话不会有什么问题,但是如果是在for循环之类的里面就效率很低了。因此我认为你应该首先去输出几个时间差,看看瓶颈在哪里。这些只是大致的推测和方向,希望对你有帮助。
谢谢,我会对程序进行调试查看具体的耗时点的。
我确实用到了size函数,而且还不少,我的点有时候一个list有成百上千数据,这可能是一个耗时点吧。
还有请问如果我用Clist代替我现在用的STL中的list,会不会改善一点?我的意思是CList与list有什么大的区别没有?我看他们功能函数都差不多。这点我会自己再程序中测试,不过还是希望有经验的朋友说说自己的看法。
也就是说,根据你的经验,在MFC中使用STL总的MAP结构和list,只要使用恰当,速度不会是问题吧?
如果是这样,只要我用心调试,效率问题能解决的了?
不过CList的GetSize是直接返回其计数,不像STL的list整个链表遍历一次,会比较快。在MFC中使用STL总的MAP结构和list,只要使用恰当,速度基本不会有问题。
2.list就是个双向链表,没有慢的道理
3.测试速度不要凭感觉
4.测debug版速度没有意义
5.编译时加入_SECURE_SCL=0,disable掉iterator越界检查,但要注意,所有库都要加这个重编译
6.存裸指针,别存对象,避免复制开销