Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Эффективная замена std::vector?

#cpp


Есть набор элементов, примерно 27 миллионов типа float. Необходимо, что бы все элементы
хранились в памяти. Используется std::vector. С элементами из vector производятся различные
операции. Доступ по индексу. 
Есть ли способ по-другому организовать хранение информации, поскольку вычислений
с данными много, а обращение через vector.at медленное?
    


Ответы

Ответ 1



Используйте прямую индексацию через перегруженный оператор []. В методе vector::at есть проверки на корректность индекса - это может уменьшать производительность. Сам по себе std::vector достаточно быстр - не хуже по производительности обычного динамического массива.

Ответ 2



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

Ответ 3



Нашёлся метод, позволяющий ускорить вычисления. Он не связан с изменением алгоритма программы. Проведена компиляция с помощью Intel C++ Compiler с включением оптимизаций под конкретный процессор. Скорость обработки увеличилась примерно в 12 раз по сравнению с билдом без оптимизаций. Выходные данные идентичны.

Ответ 4



Если Вы используете std::vector<> исключительно для доступа к элементам по индексу (через at()), то стоит подумать об использовании обычных ("сишных") массивов. Тогда, поскольку операции на массивами в С/С++ де-факто (да и де-юре) являются арифметикой над указателями, Вы получите именно скорость доступа O(1) и заметно меньшую, чем в случае с std::vector<>.at(). Недостатки: придется вспомнить malloc() :-) а если возможно изменение размеров - то и realloc() никто за Вас не будет контролировать выход за пределы массива. Безусловно, перегруженный [] в std::vector практически решает проблему, но вот вопрос более философский - стоит ли использовать более "сложную" структуру данных? Успехов!

Комментариев нет:

Отправить комментарий