Имеют ли навязчивые контейнеры все еще преимущества в производительности по сравнению с ненавязчивыми в современном C++?

Делать Boost.Intrusive контейнеры по-прежнему имеют преимущества в производительности по сравнению со стандартными ненавязчивыми (std::) в современном C++ (с семантикой перемещения, emplace_back, так далее)?

1 ответ

Решение

Да, у интрузивных контейнеров есть множество преимуществ, которые сохраняются даже при использовании семантики перемещения с контейнерами STL. В частности, расположение памяти по-прежнему, вероятно, будет лучше, что может дать значительный прирост производительности в определенных сценариях. Кроме того, итераторы по-прежнему могут значительно выиграть, а предотвращение любых накладных расходов из-за исключений может ускорить операции вставки / удаления.

Рассмотрим Таблицу 19.1 из раздела " Навязчивые и ненавязчивые контейнеры " справочника Boost. Большинство из этих преимуществ, вероятно, сохранятся, например:

  • Время вставки / стирания
  • Местоположение памяти
  • Гарантии исключения
  • Вычисление итератора по значению
  • Использование памяти

В документации Boost есть подробные метрики производительности, которые показывают относительную производительность широкого спектра операций в различных сценариях. Если вы рассмотрите, какие из них не зависят в первую очередь от распределения, все еще есть значительный потенциал.

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

Другие вопросы по тегам