2014-11-06 3 views
0

Как я могу найти информацию о распределении памяти 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 

Мой многопоточный код масштабирования очень плохо, и profiling through random sampling указывает на то, что таНос в настоящее время является узким местом в моем многопоточном коде. Кажется, что стек указывает на некоторую блокировку при распределении памяти. Как я могу найти детали этой конкретной реализации malloc?

У меня есть read, что производительность системного распределителя Windows 7 в настоящее время конкурирует с распределителями, такими как tcmalloc и jemalloc. Я работаю на Windows 7, и я создаю Visual Studio 2010. Является ли msvcr100.dll быстрым/масштабируемым «системным распределителем Windows 7» часто упоминаемым как «Современное состояние»?

В Linux я видел резкое увеличение производительности в многопоточном коде путем изменения распределителя, но я никогда не экспериментировал с этим в Windows - спасибо.

+0

* «Я подозреваю, что malloc в настоящее время является узким местом» * - почему? –

+0

@RogerRowland: Я профилировал код с помощью случайной выборки и обнаружил, что malloc является узким местом. – JDiMatteo

+1

Хорошо, но это узкое место, потому что оно «медленно» или потому, что вы слишком часто вызываете его? Я не удивлен тем, что вы показали - блокировки можно ожидать в многопоточной ситуации. –

ответ

2

утро просто спрашивает, что реализация таНос я использую с возможно ссылкой на некоторые подробности о моей конкретной версии этой реализации.

стек вызовов вы видите показывает, что MSVCRT (точнее, его по умолчанию operator new =>malloc вызывает в Win32 Heap functions. (Я не знаю, является ли malloc маршрутов всех запросов непосредственно к CRT's Win32 Heap, или делает ли это некоторые дополнительные кэширование -.. но если у вас есть VS, вы должны иметь исходный CRT код тоже, так что должны быть в состоянии проверить, что) (The Windows Internals book также говорить о Heap)


Общие рекомендации я могу дать заключается в том, что по моему опыту (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-синтаксис больше не мешал остальным распределениям системы.