#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 практически решает проблему, но вот вопрос более философский - стоит ли использовать более "сложную" структуру данных? Успехов!
Комментариев нет:
Отправить комментарий