Почему Boost unordered_map занимает слишком много времени при первой вставке?

Я разрабатываю приложение, чувствительное к задержкам, на C ++. Есть модуль, в котором я использую boost :: unordered_map. Я испытал слишком большую задержку при вставке первой записи на карту, после чего все записи имеют приличное время вставки.

Если я использую std :: unordered_map вместо boost :: unordered_map, этого не произойдет. В этом случае первая вставка также занимает несколько сотен наносекунд (100 ~ 200).

Вот некоторые статистические данные, которые я заметил: - 1-я вставка на карту: около 12 микросекунд (10 ~ 12 микросекунд) - После этого почти все вставки: 200 наносекунд (приблизительно)

Вот пример кода для иллюстрации:

struct timespec _timeSpec ;

long getTimerTime()
{
  clock_gettime(CLOCK_REALTIME, &_timeSpec);
  return ( 1000000000 * _timeSpec.tv_sec ) +  _timeSpec.tv_nsec;
}

int main()
{
  int i = 0;

  boost::unordered_map < uint64_t , std::pair < uint64_t , bool > > _turnAroundTime ;

  while( ++i != 10 )
  {
    uint64_t t1 = getTimerTime() ;

    _turnAroundTime[i] = std::make_pair ( i, true );

    uint64_t t2 = getTimerTime() ;

    std::cout << "Latency : " << t2 - t1 << std::endl;
  }

  return 0 ;
}

person bhavuk samrat    schedule 24.08.2017    source источник
comment
У вас есть вопрос?   -  person juanchopanza    schedule 24.08.2017
comment
Все ли прошивки в одно ведро?   -  person Hariom Singh    schedule 24.08.2017
comment
вызовите метод 'Reserve (N)' на карте после того, как вы его создали, но перед тем, как использовать.   -  person Richard Hodges    schedule 24.08.2017
comment
@juanchopanza: Да, вопрос в том, почему такое поведение? если я использую std :: unordered_map, такого поведения не обнаружено.   -  person bhavuk samrat    schedule 24.08.2017
comment
@bhavuksamrat Вы должны отредактировать вопрос, чтобы упомянуть об этом.   -  person juanchopanza    schedule 24.08.2017
comment
@RichardHodges: Я пробовал это, но это не имеет большого значения. Я использовал метод rehash в boost :: unordered_map   -  person bhavuk samrat    schedule 24.08.2017
comment
@bhavuksamrat Я не писал rehash(), я писал reserve(). Они очень разные.   -  person Richard Hodges    schedule 24.08.2017
comment
@RichardHodges: на самом деле boost :: unordered_map не имеет функции Reserve (), поэтому я использовал rehash (). stackoverflow.com/questions/10617829/   -  person bhavuk samrat    schedule 25.08.2017


Ответы (1)


Это было первое выделение кучи в вашей программе. Остальная часть вашей программы состояла из очень небольшого количества распределений в куче.

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

Это теория. Чтобы определить, на что именно нужно время, создайте профиль.

Если эта теория верна, последующее выделение займет больше времени из-за необходимости большего количества страниц ОС. И осторожное использование распределителя и размера ограничивающей карты может сделать это не так.

person Yakk - Adam Nevraumont    schedule 24.08.2017