Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость доступа к элементам многомерного массива 
:(
    Опции темы
Domine
Дата 25.1.2014, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Есть динамический трехмерный массив, скорость доступа к элементу складывается, как я понимаю, из двух чтений адресов и трех сложений. 
Будет-ли какой-то выигрыш в скорости доступа к элементу, если создавать массив как одномерный, и высчитывать положение нужного элемента по его трем координатам (три умножения и несколько сложений)?
PM MAIL   Вверх
vinter
Дата 25.1.2014, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(Domine @  25.1.2014,  12:55 Найти цитируемый пост)
Есть динамический трехмерный массив, скорость доступа к элементу складывается, как я понимаю, из двух чтений адресов и трех сложений. 

не правильно понимаешь, N-мерный массив представлен в памяти линейно, а обращение к нему происходит путём подсчёта нужного индекса(умножение + сложение) и одного обращения к памяти.


--------------------
Мой блог
PM MAIL WWW   Вверх
Domine
Дата 25.1.2014, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Перефразирую вопрос, к элементам какого массива быстрее получить доступ, и серьезна-ли разница во времени:
а) 
Код

T ***data = new T**[sx];
for(int x = 0; x < sx; x++)
{
    data[x] = new T*[sy];
    for(int y = 0; y < sy; y++)
    {
        data[x][y] = new T[sz];
    }
}

доступ - data[x][y][z]
и б)
Код

T *data = new T[sx * sy * sz];

где для доступа считается что-то вроде data[X * sy * sz + Y * sz + Z]
PM MAIL   Вверх
vinter
Дата 25.1.2014, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



В обоих твоих примерах нет ни одного массива, а есть указатели. Это большая разница.
Теоретически второй пример будет работать быстрее, практически - не знаю. Компиляторы сейчас творят чудеса, и, вполне вероятно, что никакой разницы не будет.


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 25.1.2014, 19:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(vinter @  25.1.2014,  15:06 Найти цитируемый пост)
Компиляторы сейчас творят чудеса, и, вполне вероятно, что никакой разницы не будет.

вариант с множеством new будет работать хуже, потому что для вычисления адреса элемента, нужно сделать 3 загрузки из случайных мест памяти. Кэш данных процессора на реальных задачах просто это не переварит, поэтому будет сильное проседание производительности. А вот умножение операция почти бесплатная, особенно, для кэша.
PM   Вверх
vinter
Дата 26.1.2014, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(bsa @  25.1.2014,  20:46 Найти цитируемый пост)
вариант с множеством new будет работать хуже, потому что для вычисления адреса элемента, нужно сделать 3 загрузки из случайных мест памяти. Кэш данных процессора на реальных задачах просто это не переварит, поэтому будет сильное проседание производительности. А вот умножение операция почти бесплатная, особенно, для кэша.

Можно ведь расположить данные последовательно в куче(я не знаю, есть ли такая оптимизация, но почему нет?) и первый пример просто превратиться во второй. Нужно измерять, разницы может не быть вообще.


--------------------
Мой блог
PM MAIL WWW   Вверх
xvr
Дата 27.1.2014, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Все зависит от конкретных значений. В частности от размеров массивов (влезут они в кэш или нет), и от того, где и как будет вычисляться X * sy * sz + Y * sz + Z (сможет компилятор что нибудь соптимизировать или нет).

PM MAIL   Вверх
akizelokro
Дата 29.1.2014, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

T ***data = new T[sx][sy][sz];

А с этим почему не сравниваете? smile 



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
mes
Дата 29.1.2014, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(akizelokro @  29.1.2014,  00:23 Найти цитируемый пост)

Код

T ***data = new T[sx][sy][sz]
;

 smile 



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1310 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.