Замена tcmalloc в Windows со статической компоновкой

Проект C ++ столкнулся с проблемой фрагментации памяти и попытался сделать следующее:

  1. nedmalloc - не прошел стресс-тест (вылетел через 15 часов), это означает, что он работает в большинстве случаев, но не во всех. И больше использования памяти, чем другие распределители.

  2. jemalloc - Не готов к работе с Windows?

  3. tcmalloc - скомпилирован с кодом хоста со статической компоновкой, но конфликтует с символами CRT. Могу ли я просто использовать псевдоним, например tc_malloc (...), чтобы создать свою собственную оболочку для распределения? Как это сделать?

Любые комментарии? Заранее спасибо.


person Jun Wan    schedule 28.09.2010    source источник


Ответы (4)


Настройте свой проект на использование кучи низкой фрагментации Windows (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;
}
person Steve Townsend    schedule 28.09.2010
comment
Спасибо. Я попробовал и был вынужден отказаться. На самом деле я не могу использовать LFH. Работайте с миллионами устаревшего кода и дорого обходитесь переделывать их с помощью LFH. Причем это только окна. - person Jun Wan; 29.09.2010
comment
К вашему сведению, Windows 7 и Vista по умолчанию используют LFH. - person 0xC0DEFACE; 28.03.2011

Существует проект jemalloc для Visual Studio 2008, 2010 и 2013 годов. https://github.com/shines77/jemalloc-win32

Я предполагаю, что это означает, что jemalloc можно использовать в Windows.

Но пока не пробовал. Убедитесь сами.

person StoneDot    schedule 19.02.2015

доступно несколько других распределителей, например malloc Дуга Леа (dlmalloc) или распределитель орды


nedmalloc - не прошел стресс-тест (вылетел через 15 часов), это означает, что он работает в большинстве случаев, но не во всех.

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

tcmalloc - скомпилирован с кодом хоста со статической компоновкой, но конфликтует с символами CRT. Могу ли я просто использовать псевдоним, например tc_malloc (...), чтобы создать свою собственную оболочку для распределения? Как это сделать?

Я бы сказал, что лучше всего сохранить символы CRT нетронутыми (на всякий случай), поэтому продолжайте и редактируйте в проекте, чтобы противоречащие символы вместо этого следовали соглашению, которое вы желаете (в конце концов, у вас есть источник по какой-то причине)

person Necrolis    schedule 28.09.2010
comment
Спасибо, я думаю, что nedmalloc реализован на основе malloc (dlmalloc) Дуга Леа. dlmalloc не является незаменимой заменой, которую я искал ранее. По отслеживанию проблемы с падением nedmalloc (int5) я не уверен. Произошло это при высоком стресс-тестировании случайно. - person Jun Wan; 28.09.2010
comment
да, nedmalloc основан на dlmalloc в качестве основного распределителя, однако это не означает, что dlmalloc является источником проблем. согласно заголовку, хотя dlmalloc в значительной степени заменяет собой (просто обратите внимание на предупреждение о многопоточности, используйте ptmalloc, если вы после многопоточности) - person Necrolis; 28.09.2010

TBB Intel предоставляет распределитель, который может работать. http://threadingbuildingblocks.org/download.php

person tgoodhart    schedule 07.07.2011