Ранг массива

 

Какая отношение в производительности, если делать двумерный массив типа array[i][j], по сравнению с тем же переделанным в одномерный array[i*j].

 

если нужен одномерный, делайте одномерный, нужен двухмерный делайте двухмерный. не нужно извращаться. производительность не упадет

 
Сколь мерный массив можно реализовать в MQL4. И все равно, хочу хоть что-то услышать, про то насколько изменяется скорость, с увеличением ранга.
 
Fletcher писал(а) >>
И все равно, хочу хоть что-то услышать, про то насколько изменяется скорость, с увеличением ранга.

Я тоже хочу, но пока-что вас этото вопрос интересует больше чем всех остальных. Проведите эксперимент и напишите о результатах.

 
Integer писал(а) >>

Я тоже хочу, но пока-что вас этото вопрос интересует больше чем всех остальных. Проведите эксперимент и напишите о результатах.

Наконец руки дошли до эксперимента.

Делает тест с массивами типа [i][j] и [i*j]. i=2000, j=2000.

Присваивает каждому элементу число, и считает время. И повторяет это 100 раз, находит средне затраченное время для каждого типа. И выводит соотношение.

У меня получилось что [i][j] работает быстрей на 60-70%, чем [i*j], очевидно из-за операции умножение.

Максимальная размерность массива - 2.

 

В данной функции сделана ошибка. Для проверки достаточно распечать получаемые индексы.

int AT00(){
  double ArrayTest[4000000];
  StartTime=GetTickCount();
  for(i=0;i<=2000;i++)
    for(j=0;j<=2000;j++)
      ArrayTest[i*j]=1.1;
  return(GetTickCount()-StartTime);
}
Более правильно считать индексы по другому [i*2000+j]
 
Vinin >>:

В данной функции сделана ошибка. Для проверки достаточно распечать получаемые индексы.

Более правильно считать индексы по другому [i*2000+j]

Да, конечно, глупая ошибка.


Исправился и исправил:

Файлы:
array_1.mq4  1 kb
 
Кстати на этот раз разница в производительности 5-20% в пользу [i][j].
 

Просто удобнее было бы сделать по другому

int AT00(){
  double ArrayTest[4000000];
  StartTime=GetTickCount();
  for(i=0;i<=4000000;i++)
      ArrayTest[i]=1.1;
  return(GetTickCount()-StartTime);
}
В этом варианте выиграет АТ00
 
Да. Когда у нас заранее известны размерности массивов, то естественно удобнее пользоваться явным определением и явным обращением. Но бывают случаи когда размерности заранее неизвестны и нужно реализовывать динамический массив. Тогда обращение с помощью расчета индекса себя оправдывает. Хотя можно заведомо выделить достаточный объем памяти. Но будет ли он достаточен. Да и ресурсы могут понадобиться в другом месте.
 
Vinin >>:

Просто удобнее было бы сделать по другому

В этом варианте выиграет АТ00

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

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