Тесты, используемые для тестирования распределителя C и c++?

пожалуйста, сообщите о критериях, используемых для тестирования распределителя C и c++? Критерии, удовлетворяющие любому из следующих аспектов:

  1. скорость
  2. фрагментации
  3. параллелизм

спасибо!

3 ответов


Если вы спросите об общем распределителе для программы C / C++, то я нашел эту статью Hoard: масштабируемый распределитель памяти для многопоточных приложений, который рассматривает этот вопрос. Это цитата из этого документа

пока нет стандартного набора критерии оценки многопоточные распределители. Мы знаем нет критериев, которые специально подчеркивают многопоточная производительность сервера приложения, такие как веб-серверы 1 и менеджер баз данных. Мы выбрали ориентиры описанные в других документах и в противном случае опубликовано (Ларсон репера Ларсона и Кришнан [22] и эталон shbench от MicroQuill, Inc. [26]), два многопоточные приложения, которые включить контрольные показатели (BEMengine [7] и Барнс-хата [1, 2]), и написал несколько нашего собственного microbenchmarks подчеркнуть различные аспекты выделения памяти производительность (threadtest, active-false, passive-false).

этот документ вроде как старый. Однако недавно я видел распределитель для HP-UX (MallocNextGen) и HP также не может гарантировать, что он хорош для всех возможных приложений. Он говорит:

новый распределитель обычно ожидается, что улучшится производительность приложения. Однако, может быть некоторые приложения, для которых производительность может ухудшиться. Следовательно, пользователи рекомендуется проверить их приложения с памятью по умолчанию распределитель в libc и с распределитель в libmallocng перед использованием новый распределитель в производстве окружающая среда.

Что касается скорости и параллелизма, мой собственный опыт заключается в том, что вам нужно измерить производительность вашей собственной программы, чтобы сравнить два разных распределителя. Если мы говорим о Linux, вы можете использовать LD_PRELOAD для загрузки различных распределителей.


Я сам тестировал несколько распределителей несколько лет назад, и мой опыт заключается в том, что все результаты зависят от вида теста. Если вы хотите написать несколько тестов самостоятельно, рассмотрите следующие ситуации:

  • выделите много памяти одного размера, а затем освободите все это
  • выделите много памяти разных размеров, а затем освободите все это
  • выделите только несколько блоков памяти, освободите их и повторите этот цикл несколько раз (повторите для одинакового размера блоки и блоки разного размера)
  • выделите много памяти разных размеров, освободите половину (например, четные выделения), затем выделите и освободите память в цикле
  • используйте два потока для параллельного выделения памяти
  • использовать три, четыре, пять, ... потоки для параллельного выделения памяти

Вы заметите, что результаты будут разными для каждого теста. Распределители, которые очень хороши в одной ситуации, могут быть плохими в другой положения.

на практике это означает, что лучше всего проверить его в вашем приложении, в живой/реалистичной ситуации.


можно скачать nedmalloc и попробуйте сравнить ваш распределитель с ним. Он имеет тест под названием test.c с исходным кодом, который вы можете переписать в соответствии с вашим распределителем.