小弟在vc2005里用mfc做个小程序 处理8个文件 每个文件400kB左右 3万行这样的 我用CArray数组 一开始setsize(0,1)运行大约要1分钟  后来setsize(50000,1) 运行却需要2分多钟  跟想的不一样  请问和解?
想优化的话 应该如何做?

解决方案 »

  1.   

    400K,50000也是不够的,迟早还得再分配。
    这可能说明CArray本身的自适应分配策略实现得更好。
      

  2.   

    setsize(50000,1)
    第二个参数有问题,使用默认值试试。
      

  3.   

    你用的参数是1,也就是说,每当对象的空间不够用的时候,它就会重新分配内存,但是只比之前的增加1个元素的空间,这样的话,每添加一个元素都要重新分配,效率就低了。如果使用默认值,MFC就会有根据自己的策略来决定每次增加多少,比如说它可能把长度增加为之前的2倍。这样的话重新分配空间的频率就降下来了,速度就上去了。
    或者你把第二个参数设置大一些,比如20000。试试。
      

  4.   

    其实,我还是没有回答你的问题:
    setsize(0,1)为什么比setsize(50000,1)还慢。我也不清楚。感觉应该不会出现这种情况。
      

  5.   

    我自己也试了一下,使用之前先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);
    }请高手指教了.
      

  6.   

    不setsize最快啊 书上说尽量先setsize的……我也试试 
    另外 这个函数的2个参数的单位是什么啊  字节 还是bit ?
      

  7.   

    我试了下 感觉不setsize和set差不多速度,呵呵
    第2个参数是-1 是什么意思啊 增量为负?
      

  8.   

    讨论一下。
    在处理大量数据时,可能的情况下不用MFC的类。自己做。
    〉〉400kB左右 3万行这样的 我用CArray数组
    400kB的数据,连1M都不到,如果数据和数据之间没有特殊参照关系,自己搞一个数组,瞬间处理完毕。
    另外CString 也是极慢的类。不适合海量数据处理。自己做一个简单的能做字符串的几个运算的类不是一个难事。而且处理速度是CString的几十倍以上。
      

  9.   

     使用之前如果不大致判断下,做SetSize,有可能会造成内存浪费的
      

  10.   


    -1表示使用MFC默认的增长策略。