Re[2]: скорость new\delete
От: enji  
Дата: 14.02.10 10:45
Оценка:
Здравствуйте, remark, Вы писали:

R>Старые аллокаторы в основном строились на основе т.н. freelist'ов. Если в таком аллокатре освобождать в случайном порядке, то образуется множество маленьких свободых блоков, эти все блоки надо хранить в списках. Далее, когда освобождаются смежные блоки, их приходится склеивать вместе, соотв. общий размер свободного блока меняется, соотв. его надо переупорядочивать в списке (списки свободных блоков обычно упорядочены по размеру для быстрого поиска).

R>В итоге, множество лишней работы, каждое освобождение может выливаться в O(logN) или что-то типа того.

R>Когда же ты освобождаешь по порядку (с начала или с конца — не важно), то получается только 1 свободный блок, размер которого постоянно растёт. Соотв. практически никакой работы делать не надо.


Если я правильно тебя понял, то получается, что освобождение по порядку должно быть быстрее, чем освобождение в случайном порядке (мне как-то так и казалось). Однако из моего эксперимента следует, что все ровно наоборот — если перемешать — быстро, если по порядку — медленно...

R>з.ы. современные аллокаторы в основном строятся на основе т.н. slab-блоков. У них множество преимуществ в т.ч. выделения и освобождения всегда O(1) не зависимо от порядка (так же они зачастую headerless и гораздо более дружественны к concurrency).


Спасибо за наводку, почитаю
... << RSDN@Home 1.2.0 alpha 4 rev. 1441>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.