![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Domine |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 18.5.2009 Репутация: нет Всего: нет |
Есть динамический трехмерный массив, скорость доступа к элементу складывается, как я понимаю, из двух чтений адресов и трех сложений.
Будет-ли какой-то выигрыш в скорости доступа к элементу, если создавать массив как одномерный, и высчитывать положение нужного элемента по его трем координатам (три умножения и несколько сложений)? |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
не правильно понимаешь, N-мерный массив представлен в памяти линейно, а обращение к нему происходит путём подсчёта нужного индекса(умножение + сложение) и одного обращения к памяти. |
|||
|
||||
Domine |
|
||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 18.5.2009 Репутация: нет Всего: нет |
Перефразирую вопрос, к элементам какого массива быстрее получить доступ, и серьезна-ли разница во времени:
а)
доступ - data[x][y][z] и б)
где для доступа считается что-то вроде data[X * sy * sz + Y * sz + Z] |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
В обоих твоих примерах нет ни одного массива, а есть указатели. Это большая разница.
Теоретически второй пример будет работать быстрее, практически - не знаю. Компиляторы сейчас творят чудеса, и, вполне вероятно, что никакой разницы не будет. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
вариант с множеством new будет работать хуже, потому что для вычисления адреса элемента, нужно сделать 3 загрузки из случайных мест памяти. Кэш данных процессора на реальных задачах просто это не переварит, поэтому будет сильное проседание производительности. А вот умножение операция почти бесплатная, особенно, для кэша. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
Можно ведь расположить данные последовательно в куче(я не знаю, есть ли такая оптимизация, но почему нет?) и первый пример просто превратиться во второй. Нужно измерять, разницы может не быть вообще. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Все зависит от конкретных значений. В частности от размеров массивов (влезут они в кэш или нет), и от того, где и как будет вычисляться X * sy * sz + Y * sz + Z (сможет компилятор что нибудь соптимизировать или нет).
|
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А с этим почему не сравниваете? ![]() -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |