Windows Server 2008 R2上的MFC 64位代码慢于32位

时间:2015-05-06 20:17:14

标签: c++ windows performance mfc 64-bit

我运行以下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

1 个答案:

答案 0 :(得分:2)

在64位模式下,指针是两倍大。因此,您可能需要在64位版本中分配最多两倍的内存,只是为了存储指针。这本身就足以减慢程序的速度。