x64免费版上的性能缓慢

Slow performance on x64 free

本文关键字:性能 缓慢 免费版 x64      更新时间:2023-10-16

我有一个这样的类(假设所有malloc的继任者(

class CMyClass
{
public:
  CMyClass()
  {
  lpData = malloc(128);
  };
  ~CMyClass()
  {
  free(lpData);
  };
public:
  LPVOID lpData;
};

然后我执行这个:

CMyClass *lpList = new CMyClass[32768];
delete [] lpList;

问题是,在x86中,代码运行良好且快速(在调试和发布版本中需要几毫秒才能完成(,但在x64中,删除调用需要大约15秒才能释放所有内存。

O.S.是Win7 x64。

如有提示,我们将不胜感激。

谨致问候,毛罗。

如果您通过调试器运行测试应用程序,则Windows调试堆可能会遇到一些性能问题。将_NO_DEBUG_HEAP=1添加到被调试对象的环境设置中(在Visual Studio 20xx下的项目属性->配置属性->调试->环境属性中(,看看这是否会提高您的解除分配性能。

我刚刚在Debian上使用gcc 4.6.1-1(添加typedef void *LPVOID后(测试了这一点。没有区别;两者都立即执行,即使没有任何优化打开。

我将数组长度增加到1048576,以获得可测量的运行时间(0.161s(,这对于IA32和AMD64都是相同的。我打开了优化(-O3(,时间保持不变,但减少到0.157s。-Os(针对大小进行优化(得到了相同的结果。

是否可能使用了不同的构建选项,比如在AMD64上启用了某种内存访问调试?

您要么错误诊断了问题,要么打开了一些堆检查。如果每个malloc/free都调用VirtualAlloc/VirtualFree,我会认为性能会很差,如果是这样的话,您在某个地方启用了内存调试。

您是否尝试分析这两个版本以查看是否有明显的内容?示例中的尺寸是实际尺寸吗?我最初的猜测是,64位版本需要(大量(内存,并导致操作系统崩溃,这将大大降低性能。

我在x64 Windows 7 SP1、x64 Release build、VC10、SP1上运行了相同的代码。x86和x64的执行方式完全相同。

也许你错过了什么。