我运行下面的MFC代码:
CArray<CString> l_Arr; for (int i = 0; i < 2000000; ++i) { CString l_sStr; l_sStr.Format("%d", i); l_Arr.Add(l_sStr); }
如果我构build64位版本,代码运行速度比32位慢2倍。 我尝试了Debug和Release版本。 时代如下:
debugging64位:15085毫秒
debugging32位:8128毫秒
版本64位:8237毫秒
发行32位:4695毫秒
我的configuration:
Microsoft Visual Studio 2005
版本8.0.50727.4039(QFE.050727-4000)
Windows Server 2008 R2 Standard 64位
处理器:Intel(R)Xeon(R)E5645 @ 2.40GHz
内存:16.0 GB
我明白,这个代码可以优化。 我不明白为什么会有这样的差异。
@BarmakShemirani,我试着用vector,如你所说,你是对的,结果是完全不同的。 它看起来像64位代码更快。 结果如下:
std::vector<CString> l_Arr; for (int i = 0; i < 2000000; ++i) { CString l_sStr; l_sStr.Format("%d", i); l_Arr.push_back(l_sStr); }
debugging64位:3563毫秒
debugging32位:4562毫秒
版本64位:1140毫秒
发行32位:1563毫秒
这里是CArray的优化版本:
CArray<CString> l_Arr; static const int K_CNT = 2000000; l_Arr.SetSize(K_CNT); for (int i = 0; i < K_CNT; ++i) { CString l_sStr; l_sStr.Format("%d", i); l_Arr[i] = l_sStr; }
debugging64位:2625毫秒
debugging32位:2625毫秒
版本64位:1015毫秒
版本32位:1438毫秒
CArray增长机制是否导致代码在64位中运行速度较慢?
我研究了CArray成长代码,本质上它分配了一个新的数组,并且每增加1024个元素就向其复制旧内容。 所以我只是用下面的结果来模拟分配代码:
static const int K_CNT = 2000000; for (int i = 0; i < K_CNT / 1024; ++i) { int l_nSize = (i + 1) * 1024 * sizeof(CString); BYTE* l_pData = new BYTE[l_nSize]; memset(l_pData, 0, l_nSize); delete[] l_pData; }
debugging64位:10483毫秒
debugging32位:4696毫秒
版本64位:5803毫秒
发行32位:2652毫秒
在64位模式下,指针是两倍大。 所以可能发生的情况是,你必须在64位版本中分配多达两倍的内存,只是为了存储你的指针。 这本身就足以让程序慢下来。