gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:38:25 25 4
gpt4 key购买 nike

如何找到我正在使用的 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 系统分配器的性能现在可以与 tcmalloc 等分配器竞争和 jemalloc .我在 Windows 7 上运行并使用 Visual Studio 2010 进行构建。msvcr100.dll 是快速/可扩展的“Windows 7 系统分配器”吗?通常被称为“最先进的”?

在 Linux 上,我已经看到通过更改分配器可以显着提高多线程代码的性能,但我从未在 Windows 上试验过这一点——谢谢。

最佳答案

am simply asking what malloc implementation I am using with maybe a link to some details about my particular version of this implementation.

您看到的调用堆栈表明 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 :低竞争锁定成本低,但更高你会看到次优的运行时行为。 (呸!曾经尝试过分析/优化影响同步性能的代码吗?真是一团糟。)

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

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

我们有一个案例,是我们使用 libxml2用于 XML 解析,并在构建 DOM 树时,它只是在 malloc 调用中淹没了系统。幸运的是,它使用了它的 own set of memory allocation routines可以很容易地用 Win32 堆函数上的薄包装器替换。这给了我们巨大的改进,因为 XML 解析不再干扰系统的其余分配。

关于c++ - 如何查找我正在使用的 Windows C++ 内存分配器的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26788536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com