Стандартный вектор и буст-массив: что быстрее? - PullRequest
16 голосов
/ 14 февраля 2011

Как производительность boost::array сравнивается с характеристикой std::vector, и какие факторы оказывают на нее значительное влияние?

Ответы [ 4 ]

31 голосов
/ 14 февраля 2011

boost::array (или C ++ 0x std::array) должно быть быстрее, чем std::vector, потому что boost::array экземпляры полностью находятся в стеке. Это означает, что boost::array не имеет выделения кучи, а также означает, что он не может превышать размер, который вы указали для него при создании.

Цель boost::array состоит в том, чтобы служить тонким слоем вокруг примитивных массивов, поэтому вы можете рассматривать их как стандартные контейнеры с .begin(), .end() и т. Д. Хорошие компиляторы должны устранять все издержки boost::array, так что он работает идентично примитивным массивам.


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

  • если вы создаете пользовательский распределитель, возможно, получая большой пул памяти при запуске программы, тогда создание или изменение размера std::vector могут быть не такими уж дорогими.
  • Замена одного std::vector на другой - обычно очень быстрая операция; скорость обмена двух указателей. Обмен двух экземпляров boost::array может быть намного дороже; в порядке копирования n элементов. Но затем, в C ++ 0x, частью которого будет std::array, замена двух массивов снова будет быстрой благодаря ссылкам на rvalue и их семантике перемещения.
  • Копирование вектора может быть очень быстрой операцией; так же быстро, как копировать указатель (копировать при записи). Копирование boost::array может потребовать копирования каждого элемента массива. Опять же, иногда копирование любого объекта происходит очень быстро, даже быстрее, чем копирование указателя и даже в вашем компиляторе C ++ 03 - благодаря elision copy.

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

17 голосов
/ 14 февраля 2011

Лучший способ прийти к какому-либо заключению - написание программ для проверки их производительности с огромным количеством данных. Как еще можно прийти к какому-либо заключению?

Пока вам это нужно, вам могут понадобиться некоторые инструменты, такие как VTune или AMD CodeAnalyst Performance Analyzer и т. Д. Очень сонный (бесплатный инструмент) - профилировщик ЦП C / C ++ для систем Windows. Вы можете попробовать их!

12 голосов
/ 14 февраля 2011

Быстрее в чем? std::vector быстрее набирать, потому что в нем меньше символа.

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

Вы хотите управлять самолетом или автомобилем в каком-то месте? Это зависит от того, что просто «быстрее».


A boost::array может быть быстрее распределен, потому что на обычных машинах он находится в стеке. Или std::vector может быть почти таким же быстрым из-за некоторой пользовательской схемы выделения памяти.

Но это только распределение. Как насчет использования? Ну, оба являются просто индексами в массиве, так что, может быть, нет никакой разницы. Но как насчет перемещения или обмена? boost::array определенно не может сделать это так быстро, потому что std::vector должен только перемещать / менять указатель. А может и нет, кто знает?

Вы должны профилировать и посмотреть на сборку. Никто не может волшебным образом знать, как все работает для вас.

2 голосов
/ 14 февраля 2011

array и vector служат немного различным целям.Если вы инициализируете vector нужным вам размером, и он никогда не будет перераспределен, производительность между ними будет одинаковой.array обрабатывает только массивы статического размера (если хотите, массивы в стиле C).vector может вырасти, если вы поместите в контейнер больше объектов, чем в данный момент имеет емкость.

...