CArray静态分配比动态分配还慢? 小弟在vc2005里用mfc做个小程序 处理8个文件 每个文件400kB左右 3万行这样的 我用CArray数组 一开始setsize(0,1)运行大约要1分钟 后来setsize(50000,1) 运行却需要2分多钟 跟想的不一样 请问和解?想优化的话 应该如何做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 400K,50000也是不够的,迟早还得再分配。这可能说明CArray本身的自适应分配策略实现得更好。 setsize(50000,1)第二个参数有问题,使用默认值试试。 你用的参数是1,也就是说,每当对象的空间不够用的时候,它就会重新分配内存,但是只比之前的增加1个元素的空间,这样的话,每添加一个元素都要重新分配,效率就低了。如果使用默认值,MFC就会有根据自己的策略来决定每次增加多少,比如说它可能把长度增加为之前的2倍。这样的话重新分配空间的频率就降下来了,速度就上去了。或者你把第二个参数设置大一些,比如20000。试试。 其实,我还是没有回答你的问题:setsize(0,1)为什么比setsize(50000,1)还慢。我也不清楚。感觉应该不会出现这种情况。 我自己也试了一下,使用之前先setsize(50000,1)果然比setsize(0,1)更慢。总结如下:1:使用之前不SetSize最快;2:使用前setsize(50000,-1)或者setsize(50000,20000)速度差不多,但是比情况1慢;3:使用前setsize(0,1)更慢;4:使用前setsize(50000,1)最慢测试函数是:void SetSizeTest(){ CArray<CString> strArray; //strArray.SetSize(50000, 20000); DWORD dwCurTick = ::GetTickCount(); for(int i = 0; i < 50000; ++i) { printf("index:%d\r\n", i); strArray.Add(CString(_T("array string element"))); } dwCurTick = ::GetTickCount() - dwCurTick; printf("Used TickCount:0x%xL\r\n", dwCurTick);}请高手指教了. 不setsize最快啊 书上说尽量先setsize的……我也试试 另外 这个函数的2个参数的单位是什么啊 字节 还是bit ? 我试了下 感觉不setsize和set差不多速度,呵呵第2个参数是-1 是什么意思啊 增量为负? 讨论一下。在处理大量数据时,可能的情况下不用MFC的类。自己做。〉〉400kB左右 3万行这样的 我用CArray数组400kB的数据,连1M都不到,如果数据和数据之间没有特殊参照关系,自己搞一个数组,瞬间处理完毕。另外CString 也是极慢的类。不适合海量数据处理。自己做一个简单的能做字符串的几个运算的类不是一个难事。而且处理速度是CString的几十倍以上。 使用之前如果不大致判断下,做SetSize,有可能会造成内存浪费的 -1表示使用MFC默认的增长策略。 请问VS2008的命令行有哪些功能 江湖救急!!!!关于全文检索引擎安装的问题 俺今天阳历生日!散分!happy birthday to myself! 关于WaitForSingleObject的一点问题! 遇到一个怪现象, 请大家帮帮忙 再问调用动态库对话框的问题。急!!!!!! 文字录入 vc++ 6.0 在win7上怎么不能生成dll文件了 MFC编程 浏览器问题 出来啦!Microsoft Visual Studio 7.0! vs2005使用ado+access问题 com和com+组件技术有何区别,一般学哪种?
这可能说明CArray本身的自适应分配策略实现得更好。
第二个参数有问题,使用默认值试试。
或者你把第二个参数设置大一些,比如20000。试试。
setsize(0,1)为什么比setsize(50000,1)还慢。我也不清楚。感觉应该不会出现这种情况。
总结如下:
1:使用之前不SetSize最快;
2:使用前setsize(50000,-1)或者setsize(50000,20000)速度差不多,但是比情况1慢;
3:使用前setsize(0,1)更慢;
4:使用前setsize(50000,1)最慢测试函数是:
void SetSizeTest()
{
CArray<CString> strArray;
//strArray.SetSize(50000, 20000);
DWORD dwCurTick = ::GetTickCount(); for(int i = 0; i < 50000; ++i)
{
printf("index:%d\r\n", i);
strArray.Add(CString(_T("array string element")));
}
dwCurTick = ::GetTickCount() - dwCurTick;
printf("Used TickCount:0x%xL\r\n", dwCurTick);
}请高手指教了.
另外 这个函数的2个参数的单位是什么啊 字节 还是bit ?
第2个参数是-1 是什么意思啊 增量为负?
在处理大量数据时,可能的情况下不用MFC的类。自己做。
〉〉400kB左右 3万行这样的 我用CArray数组
400kB的数据,连1M都不到,如果数据和数据之间没有特殊参照关系,自己搞一个数组,瞬间处理完毕。
另外CString 也是极慢的类。不适合海量数据处理。自己做一个简单的能做字符串的几个运算的类不是一个难事。而且处理速度是CString的几十倍以上。
-1表示使用MFC默认的增长策略。