如何查找Windows C++;我正在使用的内存分配器? 如何找到我正在使用的Windows C++内存分配器的细节? 调试我的C++应用程序在调用栈中显示如下: ntdll.dll!RtlEnterCriticalSection() - 0x4b75 bytes ntdll.dll!RtlpAllocateHeap() - 0x2f860 bytes ntdll.dll!RtlAllocateHeap() + 0x178 bytes ntdll.dll!RtlpAllocateUserBlock() + 0x56c2 bytes ntdll.dll!RtlpLowFragHeapAllocFromContext() - 0x2ec64 bytes ntdll.dll!RtlAllocateHeap() + 0xe8 bytes msvcr100.dll!malloc() + 0x5b bytes msvcr100.dll!operator new() + 0x1f bytes

如何查找Windows C++;我正在使用的内存分配器? 如何找到我正在使用的Windows C++内存分配器的细节? 调试我的C++应用程序在调用栈中显示如下: ntdll.dll!RtlEnterCriticalSection() - 0x4b75 bytes ntdll.dll!RtlpAllocateHeap() - 0x2f860 bytes ntdll.dll!RtlAllocateHeap() + 0x178 bytes ntdll.dll!RtlpAllocateUserBlock() + 0x56c2 bytes ntdll.dll!RtlpLowFragHeapAllocFromContext() - 0x2ec64 bytes ntdll.dll!RtlAllocateHeap() + 0xe8 bytes msvcr100.dll!malloc() + 0x5b bytes msvcr100.dll!operator new() + 0x1f bytes,c++,windows,malloc,C++,Windows,Malloc,我的多线程代码伸缩性非常差,这表明malloc目前是我的多线程代码中的一个瓶颈。堆栈似乎表明在内存分配过程中发生了一些锁定。如何找到此特定malloc实现的详细信息 我知道Windows7系统分配器的性能现在与和之类的分配器具有竞争力。我在Windows7上运行,正在使用VisualStudio2010进行构建msvcr100.dll是快速/可扩展的“Windows 7系统分配器”吗?通常被称为“最新技术” 在Linux上,我看到了通过更改分配器在多线程代码中获得的巨大性能提升,但我从未在Win

我的多线程代码伸缩性非常差,这表明malloc目前是我的多线程代码中的一个瓶颈。堆栈似乎表明在内存分配过程中发生了一些锁定。如何找到此特定malloc实现的详细信息

我知道Windows7系统分配器的性能现在与和之类的分配器具有竞争力。我在Windows7上运行,正在使用VisualStudio2010进行构建msvcr100.dll是快速/可扩展的“Windows 7系统分配器”吗?通常被称为“最新技术”

在Linux上,我看到了通过更改分配器在多线程代码中获得的巨大性能提升,但我从未在Windows上尝试过这一点——谢谢

我只是想问一下,我使用的是什么malloc实现,可能是 链接到有关我的特定版本的一些详细信息 实施

您看到的调用堆栈表明(更准确地说,它是默认的
操作符new
=>
malloc
正在调用。(我不知道
malloc
是否将所有请求直接路由到,或者它是否进行了一些额外的缓存-但是如果您有VS,您也应该有CRT源代码,因此应该能够检查它。)(还讨论了堆。)


我可以给出的一般建议是,根据我的经验(VS2005,但从VS2010判断可能类似),CRT堆的多线程性能可能会导致明显的问题,即使您没有进行大量的分配

RtlEnterCriticalSection
就是这样,答:低争用率锁定成本低,但高争用率锁定成本低,您会看到次优的运行时行为。(呸!有没有试过分析/优化影响同步性能的代码?太糟糕了。)

一种解决方案是拆分堆:使用提供了显著的改进,即使每个堆仍然启用了机器翻译(no
heap\u no\u SERIALIZE

由于您是通过
operator new
进入的,因此您可能能够对经常分配的一些不同类使用不同的分配器。或者您的一些容器可能会从中受益(然后使用单独的堆)


我们遇到的一个例子是,我们正在使用XML解析,而在构建DOM树的过程中,它只是在malloc调用中淹没了系统。幸运的是,它使用了its,可以很容易地被Win32堆函数上的一个薄包装所取代。这给了我们巨大的改进,因为XML解析不会干扰系统的其余分配ymore.

“我怀疑malloc目前是一个瓶颈”-为什么?@RogerRowland:我通过随机抽样分析了代码,发现malloc是一个瓶颈。好吧,但它是一个瓶颈,因为它“慢”或者是因为你调用它太频繁了?我对你所展示的一切并不感到惊讶-锁定在多线程的情况下是可以预期的。@RogerRowland:一些分配器比其他分配器有更好的锁定机制,以允许更好的可伸缩性。例如,tcmalloc有特定于线程的内存缓存,以允许多个线程分配内存conc目前,在许多情况下没有锁。我正在分析的代码可能调用malloc太多了,在关键循环中没有动态内存分配会更好,但这对于大型遗留代码库来说并不实用。我不知道什么,但我没有看过;-)但是,我的直觉是,在尽可能地解决了高层设计问题之前,您应该忘记底层细节(尽管我理解遗留代码的问题)。