Имеют ли навязчивые контейнеры все еще преимущества в производительности по сравнению с ненавязчивыми в современном C++?
Делать Boost.Intrusive
контейнеры по-прежнему имеют преимущества в производительности по сравнению со стандартными ненавязчивыми (std::
) в современном C++ (с семантикой перемещения, emplace_back
, так далее)?
1 ответ
Да, у интрузивных контейнеров есть множество преимуществ, которые сохраняются даже при использовании семантики перемещения с контейнерами STL. В частности, расположение памяти по-прежнему, вероятно, будет лучше, что может дать значительный прирост производительности в определенных сценариях. Кроме того, итераторы по-прежнему могут значительно выиграть, а предотвращение любых накладных расходов из-за исключений может ускорить операции вставки / удаления.
Рассмотрим Таблицу 19.1 из раздела " Навязчивые и ненавязчивые контейнеры " справочника Boost. Большинство из этих преимуществ, вероятно, сохранятся, например:
- Время вставки / стирания
- Местоположение памяти
- Гарантии исключения
- Вычисление итератора по значению
- Использование памяти
В документации Boost есть подробные метрики производительности, которые показывают относительную производительность широкого спектра операций в различных сценариях. Если вы рассмотрите, какие из них не зависят в первую очередь от распределения, все еще есть значительный потенциал.
Конечно, в конечном итоге вопрос производительности и оптимальности будет зависеть в первую очередь от вашего конкретного приложения, поэтому не рекомендуется делать обобщенные утверждения о "наилучшем" или "самом быстром" подходе. Ничто не заменит профилирование вашего конкретного кода и оценку компромиссов, связанных с дополнительной сложностью.