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

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

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

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

10.10.2012, 08:01. Просмотров 924. Ответов 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++):

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main - C++
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) - C++
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Ошибка [Linker error] undefined reference to `Vector::Vector(int)' - C++
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include &quot;Vector.h&quot; int...

vector<Struct2{int,vector<struct1>}> или множественное наследование ... - C++
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; int y; // координаты...

Указатель на объект вектор в векторе vector < vector<int>* >* - C++
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; int main( ) { using...

Как корректно скопировать vector в vector внутри класса - C++
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

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

Добавлено через 1 минуту
Ну и в релизе скорость смотри. Не может обнуление 3 миллионов элементов 200 мс занимать. Не верю!
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
10.10.2012, 09:29  [ТС] #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 #4
"Глубинный" смысл в том, что в дебаге никто скорость не проверяет.) Потому что там выполняется 100500 различный проверок, не оптимальных выражений и отсутствуют оптимизации... Что либо о скорости выполнения можно говорить только после тестирования в релизе и (обязательно!) при включении оптимизаций.
Тебе вполне может попасться литература по оптимизации приложений, в который СПЕЦИАЛЬНО отключается оптимизация в релизе, а затем автор выполняет различные приёмы, чтобы ускорить код. При этом, включение оптимизаций даёт даже лучшие результаты.) Некоторые авторы такие смешные.)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2012, 10:50
Привет! Вот еще темы с ответами:

Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>> - C++
Добрый день, подскажите пожалуйста как лучше и проще считывать файл. в файле записаны числа, разделенные пробелами и запятыми: 1, 2, 3,...

Struct / Vector / Expression: vector subscript out of range - C++
Добрый вечер. Имеется структура: struct Contact { public: string name; vector&lt;string&gt; phoneNumber; };

Записать vector<vector<wchar_t>> в текстовый файл - C++
Подскажите пожалуйста, как записать vector&lt;vector&lt;wchar_t&gt;&gt; в файл. Файл необходимо открывать через _wfopen. Пробую так, не получается....

При include<vector> не включает и не видит vector - C++
Не видит vector: //--ClassNeuron.h #ifndef NEURON_H #define NEURON_H #include &lt;cstdlib&gt; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.10.2012, 10:50
Ответ Создать тему
Опции темы

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