gpt4 book ai didi

c++ - MFC 64 位代码在 Windows Server 2008 R2 上比 32 位代码慢

转载 作者:可可西里 更新时间:2023-11-01 10:20:32 24 4
gpt4 key购买 nike

我运行以下 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 版本。时间如下:

Debug 64 bit: 15085 ms
Debug 32 bit: 8128 ms
Release 64 bit: 8237 ms
Release 32 bit: 4695 ms

我的配置:

Microsoft Visual Studio 2005
Version 8.0.50727.4039 (QFE.050727-4000)
Windows Server 2008 R2 Standard 64 bit
Processor: Intel(R) Xeon(R) E5645 @ 2.40GHz
Memory: 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);
}

Debug 64 bit: 3563 ms
Debug 32 bit: 4562 ms
Release 64 bit: 1140 ms
Release 32 bit: 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;
}

Debug 64 bit: 2625 ms
Debug 32 bit: 2625 ms
Release 64 bit: 1015 ms
Release 32 bit: 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;
}

Debug 64 bit: 10483 ms
Debug 32 bit: 4696 ms
Release 64 bit: 5803 ms
Release 32 bit: 2652 ms

最佳答案

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

关于c++ - MFC 64 位代码在 Windows Server 2008 R2 上比 32 位代码慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30086705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com