Pull to refresh

Comments 14

Для создания и уничтожения объектов std::vector использует конструкторы и деструкторы, а они в некоторых случаях могут быть значительно медленнее, чем memcpy().

Если конструкторы и деструкторы "значительно медленнее, чем memcpy()" — это верный признак того, что memcpy() там использовать не получится/нельзя.


Вообще, интересный обзорный пост, только я бы не советовал его считать истиной в последней инстанции в 2019 году.

В своё время, для минимизации времени на аллокации при работе с аудио данными в реальном времени, использовал очереди, и дёргал буферы оттуда:


queue<audio_buffer<float>> in_, out_, free_;

внутри audio_buffer всё тот же std::vector, и даже если стоял фильтр на выход с другим рэйтом, то change capacity происходил два раза: первый при создании аудио-буфера под размер входящих данных(если в очереди свободных не оказывалось ни одного), и второй (И ТО если на выходе имеем бОльший рэйт) уже непосредственно перед ресэмплингом.


И всё нормально работало (после обработки сигнал подавался на аудио выход): без лагов и тормозов, с ресэмплингом и наложением нескольких фильтров.


Если руки растут откуда надо, можно и на векторах запрогить не хуже bulk-data way storage, конечно будет некоторый оверхэд по RAM, но отпадает необходимость ручками выделять/освобождать/ресайзить.


PS: AVL-ки по сравнению с RBtree имеют худшую производительность на вставках/удалении элементов. Префиксные деревья для строковых ключей хороши.

Для этого понятия не существует распространённого термина (или я о нём не знаю). Я называю «общим массивом данных» (bulk data) любую большую коллекцию похожих объектов

Дак это же обычный односвязный список.
Bulk data — это массив, списком в нём являются только «дырки», непустые элементы ничего друг о друге не знают.

А это разве не примерно то, что находится под капотом у аллокаторов памяти?

Но на практике мне ни разу не пригождались АВЛ-деревья, красно-чёрные деревья, префиксные деревья, списки с пропусками, и т.д.

Либо человек делает что-то весьма специфическое, либо он чего-то не знает. В той же Java например TreeMap и TreeSet это красно-черное дерево. Да, не самая часто используемая структура данных, но мне ей приходилось достаточно регулярно пользоваться.

Возможно конечно имеется ввиду дерево написанное самим. Тогда соглашусь.
Вот как раз взвешенное бинарное дерево может понадобиться только в очень специфических случаях, так как есть такая штука как хэш-таблица, против которой у дерева лишь одно преимущество — оно поддерживает отсортированный порядок.
Да, об этом я и говорю. Указанные структуры именно что сортированные. И иногда они пригождались именно из-за того, что поддерживали отсортированный порядок.
Еще они будут неплохи в случае, если по какой-то причине нельзя гарантировать хорошую хэш функцию, так как в этом случае хэш таблица может деградировать до O(N), а дерево будет lg(N)
Хмм, ну я вот не вспомню сходу, когда мне важен был именно отсортированный порядок — ИМХО это достаточно редкая ситуация. В общем, пожалуй, каждому свое.
А что имеется в виду под «нельзя гарантировать хорошую хэш-функцию»?

Время на генерацию хэша для значения ключа и вставки ноды (unordered structure storage — hash based), превышают, или даже равно времени вставки ноды для ordered structure storage.


UPD: Ну или это связано с коллизиями хэша...

Ну, достаточно банальный вариант когда у есть необходимость держать сортированный список при постоянных вставках и удалениях.
Про хэш ответили выше. Либо ключи такие, что много коллизий, либо хэш считать долго. Но это еще более редкий случай, сам вживую не сталкивался.
Из относительно недавних применений деревьев:
Union-find: определение пересекаемости множеств. Есть ли у нас общие друзья на фейсбуке?
Binary space partition: быстрый поиск ближайшего объекта на карте.

Правда, это все из разряда поиграться и забить.
В геймдеве стараются избегать мэпов в целом. Не то чтобы они никогда не пригождались, но если что-то можно сделать на массивах/любых других кэш-френдли структурах, это делается на них. Тем более стараются избегать stlных мэпов(которые тоже красночерные), которые на каждую ноду делают аллокацию из кучи (если свой аллокатор не писать)

Хм, а это не тот самый Niklas, который вел отличный блог про движок bitsquid, который в какой-то момент стал autodesk stingray, и у которого были весьма похожие статьи еще в 2010, 2011 и 2015?

Sign up to leave a comment.

Articles