Другие языки программирования и технологии
Перебор двумерного массива. Вопрос на засыпку.
Создаем двумерный массив чисел. Перебираем его поэлементно вложенными циклами FOR. Почему перебор массива по строкам оказывается на порядок быстрее, чем перебор по столбцам?Напомню, что ОЗУ представляет собой одномерную линейку адресованых ячеек памяти. Время доступа к любому случайному адресу одинаково.
Дело как раз-таки в ОЗУ.
Писать много не буду, найдите книгу
"Техника оптимизации программ" К. Касперски.
Там все подробно про это написано.
add:
Впрочем, дело не только в RAM, а в процессоре, точнее, в кеше
и конвеере.
Писать много не буду, найдите книгу
"Техника оптимизации программ" К. Касперски.
Там все подробно про это написано.
add:
Впрочем, дело не только в RAM, а в процессоре, точнее, в кеше
и конвеере.
перебор всего массива включает циклы И по строкам И по столбцам.
что именно вы имели сказать?
что значит "на порядок"?
скорости работы программ по времени сравнивать не совсем правильно. сравнивают порядки (уровни сложности) кода. Для двойного вложенного цикла (где каждый из циклов бежит от 1 до N) порядок составляет N^2 и это не зависит от порядка вложенности циклов.
если же вам время работы сравнить надо, то разберитесь - в каком порядке массив хранится в памяти.. . Если хранится строка за строкой, то никакого перескакивания туда-сюда по ОЗУ не будет - всё будет работать от начала до конца постоянно в одном направлении.. .
в любом случае, это всё условно и относится лишь к одно-процессорным системам выполняющим операции последовательно...
что именно вы имели сказать?
что значит "на порядок"?
скорости работы программ по времени сравнивать не совсем правильно. сравнивают порядки (уровни сложности) кода. Для двойного вложенного цикла (где каждый из циклов бежит от 1 до N) порядок составляет N^2 и это не зависит от порядка вложенности циклов.
если же вам время работы сравнить надо, то разберитесь - в каком порядке массив хранится в памяти.. . Если хранится строка за строкой, то никакого перескакивания туда-сюда по ОЗУ не будет - всё будет работать от начала до конца постоянно в одном направлении.. .
в любом случае, это всё условно и относится лишь к одно-процессорным системам выполняющим операции последовательно...
for i:=1 to 10 do
for j:=1 to 10 do
write(n[i,j]);
естественно, цикл о (внутренний) будет выполняться гораздо быстрее цикла i (внешнего) .
for j:=1 to 10 do
write(n[i,j]);
естественно, цикл о (внутренний) будет выполняться гораздо быстрее цикла i (внешнего) .
да насчёт строк и столбцов, еси после каждого перехода в цикле строк писать слово "перешли" а после перехода цикла по столбцам писать "+", то мы получим из массива a[2][2] получим нечто подобное:
перешли+++першли+++перешли+++
следовательно считаем сколько раз за примерно одно и тоже время отработал каждый из массивов, первый тоесть его вообщето называют строки :) отработал всего три раза, а второй на удивление аш девять раз :) , однаку шустрый масив столбцов некажется ли?
Если рассматривать жизненный цикл программы с аппаратной части, то после входа в первый цикл мы выйдем из него только тагда когда уловие станет ложным тоесть for(init;question;даже хоть ничего непоставьте) -сёравно условие будет проверяться всегда впоследнюю очередь и только потом произойдёт выход
перешли+++першли+++перешли+++
следовательно считаем сколько раз за примерно одно и тоже время отработал каждый из массивов, первый тоесть его вообщето называют строки :) отработал всего три раза, а второй на удивление аш девять раз :) , однаку шустрый масив столбцов некажется ли?
Если рассматривать жизненный цикл программы с аппаратной части, то после входа в первый цикл мы выйдем из него только тагда когда уловие станет ложным тоесть for(init;question;даже хоть ничего непоставьте) -сёравно условие будет проверяться всегда впоследнюю очередь и только потом произойдёт выход
Похожие вопросы
- помогите срочно надо Квадратные массивы тема: Двумерные массивы на языке C++
- дан двумерный массив С(3,4).Получите новый массив А путём увеличения всех элементов исходного массива на число С.
- Необходимо упорядочить строки двумерного массива, по возрастанию первого эл-та. СИ.
- .помогите пожалуйста двумерный массив на языке c++
- Как можно передать ДВУМЕРНЫЙ массив в функцию в С++, не создавая его, как глобальный. Пример ниже:
- Что такое Двумерный массив?
- Ассемблер двумерный массив
- Двумерный массив с++ Пожалуйста =(
- Динамические двумерные массивы С++. Помогите разобраться.
- Каким образом в c++ можно передать двумерный массив в фунцкию?
На порядок - понятие из математики. Так условно говорят о том, что одно число в ~10 раз отлично от другого.
Не понимаю, при чем тут скорость работы программы в целом или понятие сложности кода, основанное на количестве операций. Вопрос был о времени прохождения одного участка кода (вложенных циклов) при прочих равных условиях.
Массив хранится в памяти линейкой. ОЗУ имеет одинаковое время доступа к произвольной ячейке. i-я ячейка в любом случае вычисляется по базовому адресу + смещению с учетом количества байт на одну ячейку. Процессору, как я понимаю, все равно как складывать, поскольку порядки адресов при разных способах перебора близки. А+1 или А+25 - я думаю, нет разницы.
Отличие на 1 порядок - это уже не условность, да и какая разница, на скольких процессорах это реализуется, если операция А оптимальнее Б.