Получаем количество десятичных знаков после запятой любых чисел (не только котировок) в обход Digits() на MQL4 и MQL5 - страница 15

 
Igor Makanu:

если ArrayCopy() сделан по принципу Сишного memmove(),

тогда,думаю, что скорость ArrayCopy() зависит от скорости распределения памяти, если память промежуточного буфера для копирования готова, то ArrayCopy() будет очень быстро выполнен, если память не распределена, то начнутся запросы в операционку для выделения памяти

можно попробовать потестить - сделать один вызов ArrayCopy() с большим обьемом данных, тем самым подготовив память буфера для обмена, и следом сделать цикл с ArrayCopy() с меньшими обьемами данным для копирования и с замером скорости

В нашем текущем примере копирование выполняется в статический массив, а так вообще интересно конечно, когда ArrayCopy работает медленнее простого for. Распределять память если нужно все равно придется хоть так хоть эдак.

 
Ilya Malev:

В нашем текущем примере копирование выполняется в статический массив, а так вообще интересно конечно, когда ArrayCopy работает медленнее простого for. Распределять память если нужно все равно придется хоть так хоть эдак.

не принципиально статический или динамический, мы не знаем, как реализована  ArrayCopy() , я предположил лишь, что это "обертка" над стандартными Сишными ф-циями, memmove() обычно работает через доп.буффер... ну как обычно, так писали раньше, сложно сказать как и какой компилятор работает

ЗЫ: я просто тестировать скорость выполнения на MQL не умею ((( - пару раз пробовал, вроде из справки примеры брал, почему то результаты сильно отличаются, ну и за ненадобностью забил на этот вопрос - не тестирую производительность, в профилировщике обычно смотрю, что  и как выполняется по времени

 
Igor Makanu:

 я просто тестировать скорость выполнения на MQL не умею ((( - пару раз пробовал, вроде из справки примеры брал, почему то результаты сильно отличаются, ну и за ненадобностью забил на этот вопрос - не тестирую производительность, в профилировщике обычно смотрю, что  и как выполняется по времени

вот самый простой способ, который я выше использовал

#property strict

#define   test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

вот самый простой способ, который я выше использовал


спс, забрал, завтра по тестирую

 
Ilya Malev:

Да, вот это будет работать сильно быстрее (заменил for где можно на ArrayCopy, остальное то же самое):

Я же говорю, что написал первое, что пришло в голову без тестов))

Этот вариант ничем не отличается от моего. Замеры (берется минимальное время из 10 попыток) это подтверждают.

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

Видно, что вариант с циклом быстрее, т.к. цикл из 60 /4 = 15 элементов.

Файлы:
 
fxsaber:

Этот вариант ничем не отличается от моего

Видимо да, только тип структуры и тип массива произвольные.

 
fxsaber:

Видно, что вариант с циклом быстрее, т.к. цикл из 60 /4 = 15 элементов.

Странно, что у меня с тем же MqlTicks и int получился быстрее ArrayCopy...

 
Ilya Malev:

Странно, что у меня с тем же MqlTicks и int получился быстрее ArrayCopy...

Запускаю в MT5x64.

Ilya Malev:

Видимо да, только тип структуры и тип массива произвольные.

Специально обходил общий случай, чтобы больше людей могли поучаствовать.


Пока так

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

Запускаю в MT5x64.

Специально обходил общий случай, чтобы больше людей могли поучаствовать.


Пока так

Видимо, у Вас уже быстрее :)

Туда ещё кучу служебного кода нужно добавить для доведения функционала до того же ArrayCopy (source start, dest start, count) и проверки на корректность параметров...

А вообще у Вас столько крутых работ/библиотек, что странно, что Вы спрашиваете и обсуждаете лучшее решение на форуме :)

 
Ilya Malev:

странно, что Вы спрашиваете и обсуждаете лучшее решение на форуме :)

Мне для HistoryTicks-библиотеки нужно. Спасибо, что участвуете.