Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Обнуления vector четырьмя способами - C++

10.10.2012, 08:01. Просмотров 844. Ответов 3
Метки нет (Все метки)

В моей задаче встал вопрос о занулении вектора (двумерного) на ~3 миллиона элементов. Так как вектор находится в функции, я сделал его статическим и распараллелил на 10 потоков. Скоростью все равно остался не доволен. Хоть у меня и 4 ядра, но выигрыш в ~4 раза не очень то обрадовал. Решил проверить, как же всё-таки быстрее.

Написал простенькую программку для проверки 4ех способов обнуления :
1) Инициализировать статический вектор и обнулять его (первая строка учитывает и создание вектора)
2) Инициализировать статический вектор, отчищать и пересоздавать его (clear(), resize(.., .., ..). (первая строка учитывает и создание вектора)
3) Пересоздавать вектор на регистрах каждый вызов функции, обнуляя в конструкторе vector <...> mas(.., 0); (для одномерного)
4) Пересоздавать вектор автоматически (безовсякий спецификаторов), обнуляя в конструкторе.

Какого же было мое удивление, когда обнуление на статическом массиве оказалось в !20! раз медленнее, чем автоматический вектор, а при росте N и M, выигрыш растет логарифмически. При N = 1.000, M = 2.000, выигрыш был 10 (на изображении они равны 5.000, 6.000). Как это вообще так?
А так же, почему автоматический вектор иногда быстрее, чем регистровый? Или фокус в оптимизациях компилятора, который автоматический вектор пихает в регистры, если есть место, а регистровому просто не повезло не попасть?
p.s В каждом вызове функции в конце происходит проверка на то, чтобы вектор состоял из нулей (но во времени это не учитывается), так что обнуление корректное.
Миниатюры
Обнуления vector четырьмя способами  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2012, 08:01     Обнуления vector четырьмя способами
Посмотрите здесь:

C++ vector<T> template vector<T>::iterator
C++ Указатели и их обнуления
C++ Описание метода обнуления поля
VisualStudio C++ vector<vector<int> > push_back() C++
Работа со столбцами в vector< vector<int> > C++
C++ Запись в vector<vector<char>>
C++ Не работает функция sort (vector, vector)
Сортировка vector<vector<int>> C++
Калькулятор с четырьмя арифметическими действиями C++
Обнуления значения в классе(как устранить) C++
Нюансы синтаксиса: что означает запись vector<int*> a и vector <int>*a ? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.10.2012, 09:09     Обнуления vector четырьмя способами #2
Забудь про ключевое слово register, его больше не существует. И принципиально нельзя создать объект не базового типа в регистрах.
Распараллеливать обнуление вектора бесполезно. Скорее даже потеряешь, чем выиграешь что-то.
Проходи по первой размерности при помощи итераторов (не индексов, а именно итераторов!) и для второй размерности используй memset, передавая указатель на первый элемент и размер массива в байтах. Эффективнее memset'a сложно что-то стандартное придумать. Только если на ассемблере напишешь обнуление DWORD'ов, тогда несколько быстрее будет.

Добавлено через 1 минуту
Ну и в релизе скорость смотри. Не может обнуление 3 миллионов элементов 200 мс занимать. Не верю!
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
10.10.2012, 09:29  [ТС]     Обнуления vector четырьмя способами #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Забудь про ключевое слово register, его больше не существует. И принципиально нельзя создать объект не базового типа в регистрах.
Распараллеливать обнуление вектора бесполезно. Скорее даже потеряешь, чем выиграешь что-то.
Проходи по первой размерности при помощи итераторов (не индексов, а именно итераторов!) и для второй размерности используй memset, передавая указатель на первый элемент и размер массива в байтах. Эффективнее memset'a сложно что-то стандартное придумать. Только если на ассемблере напишешь обнуление DWORD'ов, тогда несколько быстрее будет.

Добавлено через 1 минуту
Ну и в релизе скорость смотри. Не может обнуление 3 миллионов элементов 200 мс занимать. Не верю!
Да, ты прав, в релизе все гораздо быстрее. Тогда в чем собстченно глубинный смысл того, что обнуление на дебаге работает в 20 раз медленнее автоматического спецификатора, а на релизе одинаково (почти) для 81млн. элементов?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.10.2012, 10:50     Обнуления vector четырьмя способами #4
"Глубинный" смысл в том, что в дебаге никто скорость не проверяет.) Потому что там выполняется 100500 различный проверок, не оптимальных выражений и отсутствуют оптимизации... Что либо о скорости выполнения можно говорить только после тестирования в релизе и (обязательно!) при включении оптимизаций.
Тебе вполне может попасться литература по оптимизации приложений, в который СПЕЦИАЛЬНО отключается оптимизация в релизе, а затем автор выполняет различные приёмы, чтобы ускорить код. При этом, включение оптимизаций даёт даже лучшие результаты.) Некоторые авторы такие смешные.)))
Yandex
Объявления
10.10.2012, 10:50     Обнуления vector четырьмя способами
Ответ Создать тему
Опции темы

Текущее время: 07:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru