Почему освобождение происходит медленно? - PullRequest
6 голосов
/ 25 ноября 2011

У меня есть вопрос, на который я не могу найти ответ в сети ...

У меня есть набор, объявленный так:

set<unsigned int> MySet

Я вставляю миллион случайныхчисла, созданные с помощью Mersenne Twister.Генерация и вставка случайных чисел действительно быстрая (около секунды на миллион чисел), но освобождение происходит крайне медленно (1 с половиной минуты).

Почему освобождение происходит так медленно?Я не использую никаких пользовательских деструкторов для набора.

Ответы [ 2 ]

7 голосов
/ 25 ноября 2011

Скомпилируйте ваш код в режиме выпуска.

Это делает две вещи.

  1. Включает оптимизацию, которая определенно помогает.
  2. Также библиотеки управления памятьюразличаются для отладки и выпуска.
    Отладочная версия библиотеки построена так, чтобы разрешать отладку и содержать дополнительную информацию (например, маркировку нераспределенной памяти).Вся эта дополнительная обработка действительно стоит
    • Цели двух версий библиотеки совершенно разные.Релизная версия определенно оптимизирована для скорости, отладочная версия оптимизирована для восстановления и отладки.

Обратите внимание, что эта информация о DevStudio.

1 голос
/ 25 ноября 2011

Возможно, потому что имеет смысл оптимизировать распределение за счет освобождения, потому что многие приложения выделяют без освобождения, но никогда не наоборот.Я сам видел подобный шаблон в приложении, которое смешало вызовы к malloc и free (в отличие от выделения и освобождения всех сразу).

Я никогда не писал распределитель кучитак что я не знаю, есть ли более глубокая техническая причина, чем это.При освобождении смежные свободные блоки должны быть найдены и объединены.Так что работа просто принципиально другая.

90 секунд для 1 миллиона маленьких free() звуков довольно медленные.Я никогда не программировал Windows, так что я не могу сказать, что это ненормально, но система должна быть способна работать намного лучше.

Решением вашей проблемы может быть просто пропустить освобождение объектов перед программойвыходы.Вы можете попробовать извлечь пользовательский распределитель из std::allocator< unsigned int >, что делает deallocate запретом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...