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

 
Хотя не, я ошибся.  FastLog2 действительно работает быстрее при Optimize=1.  Чудеса...  Надо в С++ проверить.
 
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
 
Alexey Navoykov:
 

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

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

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

 
Проверил в C++.  Да, FastLog2 действительно быстрее всех работает. Вот уж хитрый код однако )   Возможно причина в том, что битовые операции работают значительно быстрее, чем операции сравнения.
 
Я проверял все коды в МТ4. В МТ4 компилятор не проводит оптимизации (т.е. вариант с суммой показывает те же относительные результаты, что и мой исходный вариант без суммы), и в МТ4 log2 работает быстрее, чем FastLog2. А в МТ5 уже без суммирования проводится оптимизация (т.е. код видимо не выполняется полностью), а вариант FastLog2 работает быстрее, чем log2. Какие конкретно можно сделать из этого выводы я не знаю, потому что нет деталей о том, как там и там работает оптимизатор кода.
 
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()
  {

  }


 
Ilya Malev:

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

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

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

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

 

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

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

 
Alexey Navoykov:

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

Гибкости меньше.

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