我运行以下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);
}
如果我构建64位版本,则代码运行速度比32位慢2倍。我尝试了Debug和Release版本。时间如下:
调试64位:15085 ms
调试32位:8128 ms
释放64位: 8237 ms
释放32位:4695 ms
我的配置:
Microsoft Visual Studio 2005
版本8.0.50727.4039 (QFE.050727-4000)
Windows Server 2008 R2标准版64位
处理器:Intel(R)Xeon(R)E5645 @ 2.40GHz
内存:16.0 GB
我知道这段代码可以优化。我不明白为什么会有这样的差异。
@BarmakShemirani,我按照你的建议尝试使用矢量,你是对的,结果完全不同。看起来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);
}
调试64位:3563 ms
调试32位:4562 ms
释放64位:1140 ms
版本32位:1563 ms
以下是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;
}
调试64位:2625 ms
调试32位:2625 ms
释放64位:1015 ms
发布32位:1438 ms
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;
}
调试64位:10483 ms
调试32位:4696 ms
释放64位:5803 ms
版本32位:2652 ms
答案 0 :(得分:2)
在64位模式下,指针是两倍大。因此,您可能需要在64位版本中分配最多两倍的内存,只是为了存储指针。这本身就足以减慢程序的速度。