Ранг массива - страница 2

 
Vinin >>:
Да. Когда у нас заранее известны размерности массивов, то естественно удобнее пользоваться явным определением и явным обращением. Но бывают случаи когда размерности заранее неизвестны и нужно реализовывать динамический массив. Тогда обращение с помощью расчета индекса себя оправдывает. Хотя можно заведомо выделить достаточный объем памяти. Но будет ли он достаточен. Да и ресурсы могут понадобиться в другом месте.

Тоесть мы не можем изменить разверность второго измерения массива. Или все таки есть какието способы.

 
Размерность второго измерения изменить не можем. Только первого. А при динамическом формировании это не составляет труда, хотя в производительности теряем.
 
Fletcher >>:

Ну мне то нужно было, чтобы в одномерный массив загнать двухмерный. Когда то давно, на С, делал двухмерные массивы и мне советовали их переделывать в одномерные типа [i*x+j]. Я никогда не понимал за чем это, думал так быстрее, и вот теперь решил проверить.

Так и проверять нужно было на С. Конечно же обработка одномерного массива быстрее. Если есть явное вычисление индекса, разности быть не должно поскольку компилятор двойные скобки ([][]) "раскрывает". То есть переводит в умножение и сложение. Но есть один нюанс: при обработке одномерного массива индекс явно не вычислятют (нужно использовать алгоритмы обработки соответствующие представлению данных), особенно избегают операции умножения. Более правильно так :

for(i=0,k=0;i<=2000;i++,k+=2000)
    for(j=0, jj=k;j<=2000;j++,jj++)
      ArrayTest[jj]=1.1;

Успехов.

 
VladislavVG >>:
for(i=0,k=0;i<=2000;i++,k+=2000)
    for(j=0, jj=k;j<=2000;j++,jj++)
      ArrayTest[jj]=1.1;
Попробовал так в mql4, получилось значительно быстрей, разница в 5%, в пользу двухмерного. Спасибо за идею.
Файлы:
array_v2.mq4  1 kb
 

Из выше сказанного, решил сделать тест а рифметических операций . Оказалось, что время затрачиваемое на сложение и вычитание, одинаковое или примерно одинаковое. Время затрачиваемое на умножение примерно в 13 раз больше. (очень не маленькая разница) А время на деление - примерно в 2 раза больше, чем на умножение и примерно в 25 раз медленней, чем сложение или вычитание.


Надеюсь это хоть кому-то пригодиться. :)

Файлы:
 
Fletcher >>:
Попробовал так в mql4, получилось значительно быстрей, разница в 5%, в пользу двухмерного. Спасибо за идею.

Та не за что.

Если нужен просто "потоковый" доступ, то конечно можно еще ускорить: можно обойтись без некоторых присваиваний и индекс jj сделать сплошным - то есть инициализировать во внешнем цикле, а инкременировать во внутреннем.

for(i=0,jj=0;i<=2000;i++)
    for(j=0;j<=2000;j++,jj++)
      ArrayTest[jj]=1.1;

Будет чуть медленнее, чем доступ как к одномерному массиву (см пост от Vinin - то что там описано наверняка быстрее, в крайнем случае для мкл не медленнее, чем доступ к двумерному массиву, но есть разница в количестве циклов при организации доступа и эксперимент ИМХО не будет показательным).

В С было бы быстрее использовать адресную арифметику: двигать указатели и считывать/записывать значения по адресу, но то в С....

Успехов.

Причина обращения: