【问题标题】:Slow performance on x64 free免费 x64 性能缓慢
【发布时间】:2011-07-01 18:06:46
【问题描述】:

我有这样的课程(假设所有 malloc 成功)

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

  ~CMyClass()
  {
  free(lpData);
  };

public:
  LPVOID lpData;
};

然后我执行这个:

CMyClass *lpList = new CMyClass[32768];

delete [] lpList;

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

操作系统是Win7 x64。

提示将不胜感激。

问候, 毛罗。

【问题讨论】:

  • 我很好奇,你为什么选择在类中使用 malloc()/free() 而不是 new/delete?还有,你的编译器是什么?
  • mallocfree 由您的编译器提供,而不是由 Windows 提供。在我们能够尝试任何事情之前,您需要告诉您的编译器。作为记录,在我使用 VS2010Sp1 的机器上,我没有看到这种行为。
  • mallocfree 不是由编译器提供的,它们位于 MSVCRTxx.DLL 中。他们最终致电HeapAlloc(在Windows 上)。编译器不提供函数,它只是编译。链接器只是链接。
  • 内部 malloc/free 使用与 new/delete 相同的例程,但问题不在于函数。这是操作系统变慢的特殊调试堆。

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


【解决方案1】:

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

【讨论】:

  • 我添加了环境。设置和问题消失了。我会进一步调查。非常感谢。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    您要么误诊了问题,要么打开了一些堆检查。如果每个 malloc/free 都调用 VirtualAlloc/VirtualFree,我预计会有如此糟糕的性能,如果是这样的话,你已经在某个地方启用了内存调试。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 应该只增加约 32k 的内存。分配的内存很少,不会导致操作系统崩溃。
      • @Billy:32k 绝对是低估了,32k 元素中的每一个都需要一个以上的额外字节(lpData 更大,malloc 元数据更大)。可能多 2MB。但我同意它仍然不足以引起颠簸。
      • @Ben:为什么 malloc 的元数据会更大? (32k数字来自sizeof(lpdata)
      • @Billy:因为堆元数据通常包括块长度(64 位而不是 32)和/或下一个块指针(也从 32 增加到 64 位)
      • @Ben: 啊.. 忘记大小了。我认为 RtlHeap 中没有下一个块指针,但我可能是不正确的。我对该系统的大部分研究都是处理当内存被释放时会发生什么。
      【解决方案5】:

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

      可能你错过了什么。

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 2015-01-27
        • 2021-06-04
        • 2016-11-09
        • 2021-06-21
        • 2012-05-11
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多