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

 
Nikolai Semko:
Пока в дороге. Можете сами попробовать. Идея в том, чтобы использовать юнионы с массивами структур различной размера, например 10, 100, 1000, 10000...
Это сократит цикл на порядки и сократит на порядки колличество вызовов ArrayCopy.
Это должно приблизить к варианту с memcopy

Эта идея использовалась. При этом

В исходнике все видно.
 
fxsaber:

Эта идея использовалась. При этом

В исходнике все видно.
Да, просмотрел это. Странно что не влияют.
 
Nikolai Semko:
Да, просмотрел это. Странно что не влияют.

В исходнике есть строка, отвечающая за размер

#define CONVERT_AMOUNT 128

Можно это значение менять и смотреть на результат. При значениях больше сотни скорость не растет. Это на самом деле легко объяснить, т.к. копируется по итогу все равно одинаковое количество элементов. А тормоза, связанные с малыми порциями копирования, исключаются.

 
fxsaber:

Боюсь, уже уперлись в максимальную производительность. 

Да, согласен. 
Я попробовал - тот же самый результат получился, что и у вас в TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4

 
Andrey Khatimlianskii:

Есть исходники, можно замерить самому.

Ну так замерьте. Я почти уверен, что нет, поэтому не вижу смысла тратить время ни на статью ни на замер.

 
fxsaber:

Боюсь, уже уперлись в максимальную производительность. 

Если честно, то я очень удивлен что так близко удалось приблизиться к memcpy. Этого просто не может быть. Что-то не так.

 
fxsaber:

Боюсь, уже уперлись в максимальную производительность. 

Я кажется понял очень серьезный Ваш просчет. 
В Вашем BANCH выбирается минимальный из 50 абсолютно одинаковых прогонов. 
Но компилятор большой умница и лентяй. Он не будет делать одну и ту же работу 50 раз, а оптимизирует код. Поэтому нужно хотя бы массивы менять на каждом проходе. Или вместо 50 поставить 1, но увеличить количество тестов. Тогда результаты будут совсем другие и более объективными. 

2018.12.09 13:55:43.048 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9813963
2018.12.09 13:55:43.048 StructToArray__2        TicksToIntArray_thexpert
2018.12.09 13:55:43.296 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 247579
2018.12.09 13:55:43.296 StructToArray__2        IntArrayToTicks_thexpert
2018.12.09 13:55:43.544 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 247840
2018.12.09 13:55:43.634 StructToArray__2        true
2018.12.09 13:55:43.766 StructToArray__2        
2018.12.09 13:55:43.766 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:43.766 StructToArray__2        TicksToIntArray_fxsaber4
2018.12.09 13:55:44.118 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 351847
2018.12.09 13:55:44.118 StructToArray__2        IntArrayToTicks_fxsaber4
2018.12.09 13:55:44.452 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 334011
2018.12.09 13:55:44.548 StructToArray__2        true
2018.12.09 13:55:44.692 StructToArray__2        
2018.12.09 13:55:44.692 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:44.692 StructToArray__2        TicksToIntArray_semko
2018.12.09 13:55:45.037 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 344707
2018.12.09 13:55:45.037 StructToArray__2        IntArrayToTicks_semko
2018.12.09 13:55:45.373 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 336193
2018.12.09 13:55:45.462 StructToArray__2        true

Когда разница в сравнении с memcpy 40% - это более правдоподобно

Интересно, даст эффект компрессия массива. Массив тиков можно ужать в 10-12 раз. Только вот вопрос - сэкономит ли это результирующее время при отправке и приеме через ресурс.

Файлы:
 
Nikolai Semko:

Я кажется понял очень серьезный Ваш просчет. 
В Вашем BANCH выбирается минимальный из 50 абсолютно одинаковых прогонов. 
Но компилятор большой умница и лентяй. Он не будет делать одну и ту же работу 50 раз, а оптимизирует код.

Код написан так, что будет делать именно то, что от него хотят. Компилятор не в состоянии повлиять на скорость memcpy, но результаты проходов таковы

цикл из одного прохода

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 235285
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 192509
true


Из 50-ти

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 80970
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 81103
true
 
fxsaber:

Код написан так, что будет делать именно то, что от него хотят. Компилятор не в состоянии повлиять на скорость memcpy, но результаты проходов таковы

цикл из одного прохода


Из 50-ти

Но почему тогда так происходит? Повлиять конечно компилятор не может на процесс выполнения memcpy, зато может отказаться его выполнять, вытаскивая предварительно сохраненные результаты с первого вычисления, если он понимает, что во время цикла ни один из вычисляемых параметров не меняется. Я бы сам так компилятор организовал, чтобы исправлять алогизмы программы.
 
Ilya Malev:

Ну так замерьте. Я почти уверен, что нет, поэтому не вижу смысла тратить время ни на статью ни на замер.

Мне не нужно.

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