Особенности языка mql5, тонкости и приёмы работы - страница 118

Nikolai Semko
6301
Nikolai Semko  
Alexey Navoykov:
А зачем вам одинаковая контрольная сумма, если речь идёт конкретно о замере скорости?  Суть суммы в этом случае - просто не дать компилятору вырезать код, вот и всё.  А делая srand(45), вы опять-таки позволяете оптимизировать тест.

Здесь Вы переоцениваете возможности компилятора. Уберите srand(45) - контрольные суммы станут разными, но результат скорости сохраниться.

Тем более я руководствовался тем, чтобы вычисления были одинаковыми для чистоты эксперимента, т.к. не вдавался в подробности всех функций. Иногда значение параметра функции могут влиять на время её выполнения.  

Тем более заодно проверить правильность алгоритмов.

Alexey Navoykov
4463
Alexey Navoykov  
Хотя не, я ошибся.  FastLog2 действительно работает быстрее при Optimize=1.  Чудеса...  Надо в С++ проверить.
Nikolai Semko
6301
Nikolai Semko  
Alexey Navoykov:

Кстати, по поводу нуля.  В FastLog2 нет проверки на нуль, это соответственно и фору ему даёт. Но он всё-равно в полтора-два раза медленнее, чем log2, если тестировать корректно )

А в чем некорректность?

Ведь даже ваш вариант теста выдает:

2019.01.05 04:43:12.372 TestLog (EURUSD,H1)     Result log2:       sum=1400005128  time=297 ms
2019.01.05 04:43:12.635 TestLog (EURUSD,H1)     Result log2_:      sum=1400018381  time=262 ms
2019.01.05 04:43:12.809 TestLog (EURUSD,H1)     Result _FastLog2:  sum=1400004095  time=174 ms
Georgiy Merts
8833
Georgiy Merts  
Alexey Navoykov:
 

Кстати, по поводу нуля.  В FastLog2 нет проверки на нуль, это соответственно и фору ему даёт. Но он всё-равно в полтора-два раза медленнее, чем log2, если тестировать корректно )

Не, понятное дело, проверку на нуль надо убрать из log2 или вставить такую же в FastLog2.

Вопрос, действительно, в скорости именно вычислительной части. В log2 - все считается чисто сдвигами и сложениями. В FastLog2 - использовалось табличное значение после хитрых преобразований, в котором участвует умножение. Код это весьма старый, использовался еще во времена математических сопроцессоров, с тех пор вполне себе ситуация могла поменяться.

Alexey Navoykov
4463
Alexey Navoykov  
Проверил в C++.  Да, FastLog2 действительно быстрее всех работает. Вот уж хитрый код однако )   Возможно причина в том, что битовые операции работают значительно быстрее, чем операции сравнения.
Ilya Malev
12328
Ilya Malev  
Я проверял все коды в МТ4. В МТ4 компилятор не проводит оптимизации (т.е. вариант с суммой показывает те же относительные результаты, что и мой исходный вариант без суммы), и в МТ4 log2 работает быстрее, чем FastLog2. А в МТ5 уже без суммирования проводится оптимизация (т.е. код видимо не выполняется полностью), а вариант FastLog2 работает быстрее, чем log2. Какие конкретно можно сделать из этого выводы я не знаю, потому что нет деталей о том, как там и там работает оптимизатор кода.
Ilya Malev
12328
Ilya Malev  
void f(){
  static int a[]; 
  Print("a[]=",ArraySize(a)); 
  ArrayResize(a, 100); 
  Print("a[]=",ArraySize(a));}


class A
 {
public: A(){ f(); }
 };
 
A _a;

void OnStart()
  {

  }


fxsaber
14391
fxsaber  
Ilya Malev:

Это стандартное поведение MQL5: static-переменные начинают работать после глобальных.

Можно очень серьезно нарваться из-за этого.
Ilya Malev
12328
Ilya Malev  
fxsaber:

Это стандартное поведение MQL5: static-переменные начинают работать после глобальных.

Это поэтому каждую статик-переменную класса/структуры нужно обязательно вторично объявлять после самой структуры? Причем, даже без присваивания ей какого-либо значения... Может стоит внести предложение, чтобы компилятор все это делал автоматом сам?

Alexey Navoykov
4463
Alexey Navoykov  

По сути это баг, нарушение последовательности выполнения кода программы. Компилятор не должен позволять такого в принципе.  Надо почаще дёргать разработчиков насчёт этого.

В С++ код обрабатывается компилятором строго сверху вниз, поэтому всё что сверху - уже инициализировано.  А к нижнему ты обратиться не можешь. Поэтому всё чётко.  А раз тут разработчики ввели какие-то свои правила, то пусть обеспечат корректный порядок выполнения кода.