x64免费性能下降

时间:2011-07-01 18:06:46

标签: c++ performance heap free 64-bit

我有一个这样的类(假设所有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。

提示将不胜感激。

此致 莫罗。

5 个答案:

答案 0 :(得分:7)

如果您通过调试器运行测试应用程序,可能会遇到Windows调试堆的某些性能问题。将_NO_DEBUG_HEAP=1添加到调试对象的环境设置中(在Visual Studio 20xx下的Project Properties-> Configuration Properties-> Debugging-> Environment属性中),看看是否可以改善你的释放性能。

答案 1 :(得分:1)

我刚刚在Debian上使用gcc 4.6.1-1(在添加typedef void *LPVOID之后)对此进行了测试。没有区别;即使没有打开任何优化,它们也会立即执行。

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

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

答案 2 :(得分:1)

您要么误解了问题,要么开启了一些堆检查。如果每个malloc / free都称为VirtualAlloc / VirtualFree,我会期待如此糟糕的性能,如果是这样的话,你已经在某处启用了内存调试。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

愿你遗失一些东西。