Подтвердить что ты не робот

Стандартный векторный и ускорительный массив: что быстрее?

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

4b9b3361

Ответ 1

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

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


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

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

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

Ответ 2

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

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

Ответ 3

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

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

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


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

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

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

Ответ 4

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