Замена Windows tcmalloc со статической связью
Проект C++ столкнулся с проблемой фрагментации памяти и попытался сделать следующее:
nedmalloc - не прошел стресс-тест (разбился через 15 часов), это означает, что он работает в большинстве случаев, но не во всех. И больше использования памяти, чем другие распределители.
jemalloc - не готов для Windows?
tcmalloc - скомпилирован с хост-кодом со статической связью, но конфликтует с символами CRT. Могу ли я просто использовать псевдоним, такой как tc_malloc(...), чтобы создать свою собственную оболочку для выделения? Как это сделать?
Любые комментарии? Заранее спасибо.
4 ответа
Настройте свой проект на использование Windows Low Fragmentation Heap (LFH) с использованием этого API в начале программы. Это может решить вашу проблему без дополнительной работы над пользовательскими реализациями.
Пример кода, взятый непосредственно из MSDN:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define HEAP_LFH 2
int __cdecl _tmain()
{
BOOL bResult;
HANDLE hHeap;
ULONG HeapInformation;
//
// Note: The HeapSetInformation function is available on Windows 2000 with SP4
// only if hotfix KB 816542 is installed. To run this example on Windows 2000,
// use GetProcAddress to get a pointer to the function if available.
//
//
// Enable heap terminate-on-corruption.
// A correct application can continue to run even if this call fails,
// so it is safe to ignore the return value and call the function as follows:
// (void)HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
// If the application requires heap terminate-on-corruption to be enabled,
// check the return value and exit on failure as shown in this example.
//
bResult = HeapSetInformation(NULL,
HeapEnableTerminationOnCorruption,
NULL,
0);
if (bResult != FALSE) {
_tprintf(TEXT("Heap terminate-on-corruption has been enabled.\n"));
}
else {
_tprintf(TEXT("Failed to enable heap terminate-on-corruption with LastError %d.\n"),
GetLastError());
return 1;
}
//
// Create a new heap with default parameters.
//
hHeap = HeapCreate(0, 0, 0);
if (hHeap == NULL) {
_tprintf(TEXT("Failed to create a new heap with LastError %d.\n"),
GetLastError());
return 1;
}
//
// Enable the low-fragmenation heap (LFH). Starting with Windows Vista,
// the LFH is enabled by default but this call does not cause an error.
//
HeapInformation = HEAP_LFH;
bResult = HeapSetInformation(hHeap,
HeapCompatibilityInformation,
&HeapInformation,
sizeof(HeapInformation));
if (bResult != FALSE) {
_tprintf(TEXT("The low-fragmentation heap has been enabled.\n"));
}
else {
_tprintf(TEXT("Failed to enable the low-fragmentation heap with LastError %d.\n"),
GetLastError());
return 1;
}
return 0;
}
Есть проект jemalloc для визуальной студии 2008, 2010 и 2013 годов. https://github.com/shines77/jemalloc-win32
Я предполагаю, что это подразумевает, что jemalloc можно использовать в Windows.
Но я еще не пробовал. Проверьте это сами.
Есть также несколько других доступных распределителей, таких как malloc (dlmalloc) Дуга Лай или распределитель орды.
nedmalloc- не прошел стресс-тест (разбился через 15 часов), это означает, что он работает в большинстве случаев, но не во всех.
Посмотрите, можете ли вы отследить, где и почему он потерпел крах, прежде чем покинуть его, это может быть просто ошибкой с вашей стороны, также проверьте репозиторий SVN от ned, возможно, уже есть решение вашей проблемы.
tcmalloc - скомпилирован с хост-кодом со статической связью, но конфликтует с символами CRT. Могу ли я просто использовать псевдоним, такой как tc_malloc(...), чтобы создать свою собственную оболочку для выделения? Как это сделать?
Я бы сказал, что лучше сохранить символы CRT нетронутыми (на всякий случай), поэтому идите вперед и отредактируйте проект, чтобы вместо этого соответствующие символы следовали соглашению, которое вы желаете (в конце концов, у вас есть источник по причине)
TBB от Intel предоставляет распределитель, который может работать. http://threadingbuildingblocks.org/download.php