如何查找我正在使用的Windows C ++内存分配器的详细信息?

时间:2014-11-06 20:10:42

标签: c++ windows malloc

如何查找我正在使用的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   

我的多线程代码扩展性很差,profiling through random sampling表示malloc目前是我的多线程代码的瓶颈。堆栈似乎表明在内存分配期间发生了一些锁定。我怎样才能找到这个特定malloc实现的细节?

我已read Windows 7系统分配器性能现在与tcmallocjemalloc等分配器竞争。我在Windows 7上运行,并且正在使用Visual Studio 2010进行构建。 msvcr100.dll是快速/可扩展的" Windows 7系统分配器"通常被称为"最先进的技术"?

在Linux上,我通过更改分配器看到了多线程代码的显着性能提升,但我从未在Windows上尝试过这一点 - 谢谢。

1 个答案:

答案 0 :(得分:2)

  

我只是问我正在使用的malloc实现可能是一个   链接到我的特定版本的一些细节   实施

您看到的callstack表示MSVCRT(更准确地说,默认operator new => malloc正在调用Win32 Heap functions。(我不知道)是malloc是否将所有请求直接路由到CRT's Win32 Heap,或者它是否进行了一些额外的缓存 - 但如果你有VS,你也应该有CRT源代码,所以应该能够检查它。) (Windows Internals book也谈论堆。)


我能给出的一般建议是根据我的经验(VS 2005,但从Hans' answer on the other question判断VS2010可能类似)CRT堆的多线程性能会引起明显的问题,甚至如果你没有做大量的分配。

那个RtlEnterCriticalSection只是一个Win32 Critical Section:以低争用来锁定,但是如果更高,你会看到次优的运行时行为。 (Bah!曾经试图描述/优化同步性能咳嗽的代码吗?这是一团糟。)

一种解决方案是分割堆:使用different Heaps给我们带来了显着的改进,即使每个堆仍然启用了MT( HEAP_NO_SERIALIZE)。

由于您是通过operator new“进入”,因此您可能可以为经常分配的某些不同类使用不同的分配器。或者也许你的一些容器可以从custom allocators中受益(然后使用一个单独的堆)。

我们遇到的一个案例是,我们使用libxml2进行XML解析,并且在构建DOM树时,它只是在malloc调用中淹没了系统。幸运的是,它使用了own set of memory allocation routines,可以通过Win32 Heap函数上的瘦包装轻松替换它。这给了我们很大的改进,因为XML解析不再干扰系统的其余分配。