Boost :: Навязчивый для HPC - PullRequest
4 голосов
/ 30 июля 2011

Насколько хороша библиотека boost::intrusive для высокопроизводительных вычислений? Я хочу использовать контейнер для не копируемого и не присваиваемого класса. Я планировал использовать нормальный STL с shared_ptr. Я обнаружил, что boost::intrusive также может быть использован для той же цели. Итак, мой вопрос, действительно ли они так эффективны?

, если вам предоставлен выбор между контейнером STL с типами shared_ptr и boost::intrusive, какой из них вы бы предпочли?

1 Ответ

2 голосов
/ 30 июля 2011

Как правило, навязчивые коллекции являются наиболее эффективными с точки зрения использования памяти. Если ваша цель - выжать каждый последний цикл процессора, это единственный путь.

Рассмотрим список общих указателей надстройки. При создании нового объекта происходит следующее:

  • объект, выделенный из кучи и инициализированный
  • конструктор общего указателя boost из необработанного указателя выделяет другой объект в куче для хранения счетчика ссылок объекта (именно поэтому улучшающий навязчивый указатель лучше, поскольку счетчик ссылок хранится в объекте, избегая этого выделения)
  • list :: insert выделяет узел списка и копирует общий указатель

В приведенном выше описании выделено три выделения памяти для создания и вставки нового объекта в коллекцию.

Теперь рассмотрите возможность использования навязчивого списка. Для той же задачи, что происходит:

  • новый объект выделяется и инициализируется
  • list :: insert просто назначает указатели узла списка объекта, так как узел встроен в объект и уже выделен

Здесь происходит только одно выделение памяти. Поскольку процессор использует меньше памяти при использовании навязчивых коллекций, кэши центрального процессора используются лучше, что приводит к меньшему количеству пропусков кэш-памяти и сокращению объема используемой памяти (известного как принцип ссылочной локальности).

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

...