Производительность накопителя сильно снижается при выделении кусков большого размера.

Ниже я написал пример программы на «C», которая интенсивно использует динамическую память, и попытался сравнить то же самое (с точки зрения времени) для распределителя по умолчанию «glibc» по сравнению с распределителем Hoard.

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define NUM_OF_BLOCKS   (1 * 4096)
  5
  6 void *allocated_mem_ptr_arr[NUM_OF_BLOCKS];
  7
  8 int
  9 main (int argc, char *argv[])
 10 {
 11     void *myblock = NULL;
 12
 13     int count, iter;
 14
 15     int blk_sz;
 16
 17     if (argc != 2)
 18     {
 19         fprintf (stderr, "Usage:./memory_intensive <Block size (KB)>\n\n");
 20         exit (-1);
 21     }
 22
 23     blk_sz = atoi (argv[1]);
 24
 25     for (iter = 0; iter < 1024; iter++)
 26     {
 27         /*
 28          * The allocated memory is not accessed (read/write) hence the residual memory
 29          * size remains low since no corresponding physical pages are being allocated
 30          */
 31         printf ("\nCurrently at iteration %d\n", iter);
 32         fflush (NULL);
 33
 34         for (count = 0; count < NUM_OF_BLOCKS; count++)
 35         {
 36             myblock = (void *) malloc (blk_sz * 1024);
 37             if (!myblock)
 38             {
 39                 printf ("malloc() fails\n");
 40                 sleep (30);
 41                 return;
 42             }
 43
 44             allocated_mem_ptr_arr[count] = myblock;
 45         }
 46
 47         for (count = 0; count < NUM_OF_BLOCKS; count++)
 48         {
 49             free (allocated_mem_ptr_arr[count]);
 50         }
 51     }
 52 }

В результате этой тестовой активности я получил следующие результаты (размер блока, время, прошедшее для распределителя по умолчанию, время, прошедшее для хранилища):

  1. '1K' '4.380s' '0.927s'
  2. '2k' '8.390s' '0.960s'
  3. '4k' '16.757s' '1.078s'
  4. '8k' '16.619s' '1.154s'
  5. '16k' '17.028s' '13m 6.463s'
  6. '32k' '17.755s' '5m 45.039s'

Как видно, производительность Hoard сильно снижается при размере блока >= 16 КБ. Какова причина? Можно ли сказать, что Hoard не предназначен для приложений, выделяющих куски большого размера?


person Vivek Gupta    schedule 05.01.2013    source источник
comment
Вы заглядывали внутрь исходного кода упомянутых вами распределителей? Это бесплатное программное обеспечение.   -  person Basile Starynkevitch    schedule 05.01.2013
comment
См. этот вопрос stackoverflow.com/q/9204354/841108   -  person Basile Starynkevitch    schedule 05.01.2013
comment
Я попытался воспроизвести ваш тест, и hoard превзошел стандартный распределитель для каждого размера, особенно для больших размеров блоков. (Linux, x86-64, hoard 3.8) Например, при размере 32 КБ накопление заняло 11,22 секунды. Стандартный аллокатор занял 35,89 секунды.   -  person David Schwartz    schedule 05.01.2013
comment
Ага! для номеров строк. очень весело вырезать/вставлять код =P   -  person WhozCraig    schedule 05.01.2013
comment
Ясно, что здесь что-то не так. Раньше я просматривал Hoard, но что-то пошло не так, чтобы скомпилировать его на моей машине, так что ничего не получилось.   -  person Mats Petersson    schedule 05.01.2013


Ответы (1)


На http://locklessinc.com/benchmarks_allocator.shtml есть несколько хороших тестов и пояснений:

Для небольших распределений он по-прежнему работает аналогично tcmalloc. Однако после 64 КБ производительность резко падает. Он использует центральное «хранилище» для перераспределения памяти между потоками. Это представляет собой узкое место, поскольку только один поток может использовать его одновременно. По мере увеличения количества потоков проблема становится все хуже и хуже.

person PauliusZ    schedule 29.01.2014