2016-09-21 2 views
0

array против std::queue, что лучше с точки зрения времени и почему?Почему массив считается лучше, чем контейнеры STL?

Я написал один алгоритм обработки графа, в котором граничные вершины хранятся в std::queue и доступны с использованием push_back() и pop_front(). Когда я повторно реализовал границу с массивом с передними и конечными указателями, указывающими на начало и конец пограничных вершин, я получаю лучший результат с точки зрения времени. Является ли массив действительно быстрее, чем очередь, для большого размера данных?

+6

Вы сравниваете яблоки с апельсинами. Если вам нужна структура очереди, зачем использовать что-то, что не является очередью? – NathanOliver

+1

Доступ к элементам в массиве и в векторе - это O (1). Разница во времени, если вообще что-то, незначительна. Что * * отличается друг от друга тем, что вектор * динамический *, когда вы добавляете элементы в вектор, ему может потребоваться изменить его размер, включая копирование существующих данных. Это может быть медленным. Если вы знаете приблизительно количество необходимых элементов, вы можете зарезервировать эту сумму для вектора, а разность скоростей будет равна примерно нулю. Если вы хотите использовать контейнер с фиксированным количеством элементов времени с компиляцией, вместо этого используйте 'std :: array'. –

+0

Один статический, другой динамический. –

ответ

1

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

https://www.youtube.com/watch?v=YQs6IC-vgmo

+0

Реализации std :: queue имеют тенденцию выделять смежные блоки памяти увеличивающегося размера (например, блок для первых 16 элементов, а затем блок для следующих 32 элементов), которые являются такими же большими или большими, как размер строки кэша. Таким образом, различие заключается в том, являются ли последующие пропуски кэша последовательными или нет, что в целом менее эффективно. –

Смежные вопросы