599 / 436 / 136
Регистрация: 22.11.2017
Сообщений: 1,344
|
||||||
1 | ||||||
Сделайте, чтобы двумерный вектор обогнал двумерный массив при заполнении случайными числами07.02.2019, 10:21. Показов 5730. Ответов 31
Метки нет (Все метки)
Всем привет!
Попробовал сравнить время заполнения векторов в векторе и массивов в массиве (динамические) случайными числами, получаемыми STL генератором. Вот фрагменты кода
first -> длина стороны матрицы n (получается двумерный массив n x n) second -> время заполнения матрицы такого размера случайными числами, передаётся в мой алгоритм построения графиков, который начертил то, что приведено на прикреплённом скрине. Для динамического массива - оранжевый. Для вектора - циан. По оси x размер стороны квадратной матрицы n, по оси y кол-во секунд, затраченное на заполнение матрицы такого размера случайными числами. Чем больше (выше) - тем хуже (медленней). Как видно вектор долго возится (циановые кольца выше оранжевых, то есть затрачено больше времени), массив его обходит по времени. Я делал ставку на вектора в векторе, но они проиграли массивам в массиве по времени выполнения. Предлагаю Вам предложить мне коды, которые бы при равноценных условиях заполняли случайными числами по STL и вектора в векторе и таким же образом массивы в массиве, но чтобы вектор выиграл по времени. Возможно я использовал недостаточно чёткий алгоритм заполнения векторов и массивов.
0
|
07.02.2019, 10:21 | |
Ответы с готовыми решениями:
31
Двумерный массив со случайными числами Задать двумерный массив со случайными числами Заполнить двумерный массив случайными числами Заполнить двумерный массив случайными числами |
599 / 436 / 136
Регистрация: 22.11.2017
Сообщений: 1,344
|
|
07.02.2019, 14:55 [ТС] | 21 |
Сравнил работу оператора [] для обращения по индексу и метода at() для обращения по индексу. Результаты почти одинаковы. В пределах ошибки.
0
|
599 / 436 / 136
Регистрация: 22.11.2017
Сообщений: 1,344
|
|
07.02.2019, 18:05 [ТС] | 22 |
Такое ощущение что оператор [], перегруженный для экземпляров вектора, вызывает метод и/или проверяет указанный индекс на предмет выхода за границы диапазона.
Добавлено через 2 минуты Я попробовал за передлы индекс указать, выпало исключение vector subsctipt out of range. Значит проверяет всё таки? Иначе бы просто разрешил обратиться в ячейку памяти в окрестностях массива, обслуживаемого данным экземпляром вектора. Оказалось это не выброс исключения, а просто вылет программы при выполнении. А вот at скинул исключение при выходе за границы.
0
|
18894 / 9852 / 2410
Регистрация: 30.01.2014
Сообщений: 17,295
|
|
07.02.2019, 19:48 | 23 |
Сообщение было отмечено SomniPhobia как решение
Решение
Это assert сработал. И срабатывает он только в отладочном режиме. Вы что, замеры делаете в Debug сборке?
Еще бы у вас не было расхождений. В Debug режиме у библиотечных классов куча доп. проверок, чтобы ускорить отладку и отключена оптимизация. Никто не меряет производительность в отладочном режиме, просто потому что он не для этого.
1
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
07.02.2019, 20:08 | 24 |
DrOffset, я делал замеры в релизе, лично мне не удалось поймать существенных различий, в ТС какая-то другая ситуация и это все из-за дебага?
0
|
Неэпический
|
||||||
07.02.2019, 20:46 | 25 | |||||
Сообщение было отмечено SomniPhobia как решение
Решение
https://wandbox.org/permlink/2QVHwvTv7ad0YWA6
1
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|
07.02.2019, 21:02 | 26 |
Понятно, почему совпали. В double test_vector(..) сам вектор Вы не поменяли.
(поменяли копию массива вектора h).
0
|
599 / 436 / 136
Регистрация: 22.11.2017
Сообщений: 1,344
|
||||||
07.02.2019, 21:04 [ТС] | 27 | |||||
DrOffset, Azazel-San, в режиме release совсем другой результат.
Спасибо DrOffset. Всё дело в режиме запуска оказалось. Вот код, на который построены прикреплённые графики. В режиме релиза на 1млн и на 2 млн построилось за считанные секунды. В дебаге - несколько минут потребовалось.
0
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
07.02.2019, 21:19 | 28 |
SomniPhobia, ну вот и совпали, я что-то не подумал что Вы тестили в дебаге, я знал что нельзя делать замеры в дебаге, но честно сказать не думал что такая сильная разница будет, но видимо особенно это бьет по STL контейнерам, как и сказал DrOffset из-за всяких проверок.
1
|
18894 / 9852 / 2410
Регистрация: 30.01.2014
Сообщений: 17,295
|
|
07.02.2019, 21:20 | 29 |
2
|
599 / 436 / 136
Регистрация: 22.11.2017
Сообщений: 1,344
|
||||||
07.02.2019, 21:31 [ТС] | 30 | |||||
Croessmah, здравствуйте!
Вот на Ваш вариант кода замеры. Время в миллисекундах отложено на графике.
0
|
599 / 436 / 136
Регистрация: 22.11.2017
Сообщений: 1,344
|
|
07.02.2019, 21:49 [ТС] | 31 |
SerVal, не копию. Метод data() вернул указатель на массив, который обслуживает текущий экземпляр класса вектор. Я проверял - назначил значения через h, потом прочитал через v[i] ответы были, то есть там числа были занесены в сам вектор.
Croessmah, Вы даже сделали так, что на дебаге совпали значения вектора и массива, образующих матрицу.
0
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|
08.02.2019, 00:37 | 32 |
А.. понятно.. Переменные типа auto x = auto start + auto finish
... сразу и не поймёшь, где объект, а где указатель на него.
0
|
08.02.2019, 00:37 | |
08.02.2019, 00:37 | |
Помогаю со студенческими работами здесь
32
Заполнить двумерный массив случайными числами Заполнить двумерный массив случайными числами Заполнить двумерный массив случайными числами Заполнить двумерный массив случайными числами Двумерный массив заполнить случайными числами. Заполнить динамический двумерный массив случайными числами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |