Вопрос про быстродействие MQL5

 

Ну во первых, поздравляю с выпуском бетты! ( Но кстати вы скорее всего снизите эффект, из за того что выдет новая винда. Вам надо было либо раньше, либо уже после нового года, так как пару месяцев все будут говорить только про семерку а потом дружно всем миром готовиться к НГ ) ;)

Во вторых сообственно очень порадовалло быстродействие.

И в треьих сообственно вопрос :

Вопрос про оптимизицию


Имеем код

input double   Input1;
input int      Input2;
int OnInit()
  {

   
   
   int a=0;
   int b=0;
   
   int t0=GetTickCount() ;
   
   for ( int i=0; i< 200000000; i++ ){
      a=a+GetTickCount();
      b++;
   }
   
   int t1 = GetTickCount() ;
   
   double t = t1 - t0;
   
   double it = ((double)t/b)/1000;
   
   printf("1 =============>dt=%d,iter time = %0.20f sec %010.0f cycle per sec",t,it,1/it);   
   
   a=0;b=0;
   
   t0=GetTickCount() ;
   
   for ( int i=0; i< 200000000; i++ ){
      a = a+2;
      b++;
   }
   
   t1=GetTickCount();  
   
   t=t1-t0;
   
   
   it = ((double)t/b)/1000;
    
   
   printf("2 =============>dt=%d,iter time = %0.20f sec %010.0f cycle per sec",t,it,1/it);   
   
   
   
   return(0);
}

void OnDeinit ( const int reason )
  {
   
  }
  
void OnTick()
  {
   
   
  
   
  }

и результат -

2009.10.12 чч:мм a1 (EURUSD,H1) 2 =============>dt=0,iter time = 0.00000000796000000000 sec 0125628141 cycle per sec
2009.10.12 чч:мм a1 (EURUSD,H1) 1 =============>dt=0,iter time = 0.00000001084000000000 sec 0092250923 cycle per sec

По моим рассуждениям, в случае хорошей оптимизации, время выполненя должно быть одинаково. Но как мы видим, что нет. Вообще то результат очень не плохой по быстродействию. Но вот насколько хороша у вас оптимизация? ... Другой ворос "а насколько она нахрен нужна в коде советников", но все же раскажите, чего ждать от неё, а чего нет?

И в конце как всегда от меня, как всегда, несколько замечаний, тем более что раз уж это бетта и замечания требуются.

1) Странное поведение с диалогами при нажании кнопки запустить в отладчике. Выскакивает диалог с вопросом о параметрах, кстати а где "этот запрос" можно отменить ? Ну так вот, выскакивает но эксперт благополучно запускается и отрабатывает, даже если на этот диалог не ответить. До брейка на ретурне из OnInit не брекутеся но печать идет . Происходит не всегда. Но когда писал этот текст проверил раз 10. Но теперь вот уже после написания стал проверять и все работает. Хм... секундочку....

Ага, :) Разобрался, :) Простите, за сумбур. Но чтобы воспроизвести надо делать так

0) В редакторе открываем код эксперта

1) Открываем окно графика.

2) Набрасываем на него эксперта

3) Ждем вывода в лог.

4) Стираем лог

5) Нажимаем кнопку старт в редакторе

6) Видим диалог

7) Не отвечаем и смотрим в окно лога....

2)При нажании кнопки создать експерта, он создается с синтактической ошибкой.

OnDeinit function defined with wrong parameters 2.mq5 22
6

-------------------------------------

|

V

void OnDeinit()
{
//---

}

 

А кто такой GetTickCount? Если это функция WinAPI, то ее вызов достаточно накладен.

С другой стороны, если Вы проверяете может ли компилятор инлайнить код-

то функцию надо написать в этом же файле и без внешних вызовов.

Собственно, без оптимизации, большое кол-во вызовов функции языка С/С++ в цикле,

по моему опыту, может быть раз в 10 дольше, чем исполнение того же кода 

без разбиения на функции. Только такое кол-во прогонов достаточно редко.

 
jartmailru писал(а) >>

А кто такой GetTickCount? Если это функция WinAPI, то ее вызов достаточно накладен.

С другой стороны, если Вы проверяете может ли компилятор инлайнить код-

то функцию надо написать в этом же файле и без внешних вызовов.

А вы сами то что не знаете? :) И особенно причем тут WinApi ? :))

 
SProgrammer >>:

А вы сами то что не знаете? :) И особенно причем тут WinApi ? :))

Видимо, для вас реальности кроме mql нет- ну что делать... вы не стесняйтесь,

спросите, что такое "инлайнить", какие накладные издержки при вызове функции.

Я чувствую, у вас не хватает квалификации- поэтому, конечно, помогу.

.

WinApi при том, что функция GetTickCount() описана в платформе MSDN.

http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx

И есть подозрение, что в mql- это не просто синоним, а делегирование вызова.

.

Там по-английски, но если вы попросите- я вам переведу с удовольствием.

 
jartmailru писал(а) >>

Видимо, для вас реальности кроме mql нет- ну что делать...

Причем тут WinApi? :)

 
jartmailru писал(а) >>

Видимо, для вас реальности кроме mql нет- ну что делать... вы не стесняйтесь,

спросите, что такое "инлайнить", какие накладные издержки при вызове функции.

Я чувствую, у вас не хватает квалификации- поэтому конечно помогу.

ТоварыЩ, :)) Причем тут винапи?

 
SProgrammer >>:

Причем тут WinApi? :)

Какой вы нетерпеливый и жадный до знаний.

Пока я редактировал пост- уже столько реплик добавили :-).

Ответил выше- посмотрите.

 
jartmailru писал(а) >>

Какой вы нетерпеливый и жадный до знаний.

Пока я редактировал пост- уже столько реплик добавили :-).

Ответил выше- посмотрите.

Вы меня просто смешите, ГетТикКаунт, скорее всего ( просто уже не помню ) это считывания одного поля из служебной струкутры процесса. Все импленентированно в статике, :) Причем тут по большому счету винапи. :) А по еще большему, причем тут вин апи в моем вопросе про оптимизацию. :) Пусть там будет хоть LinuxApi :) Время должно быть одинаковым при хорошей оптимизиции. :)

Вообщем ув. гр. jart, вы ответили, спасибо... И достаточно. :)

 

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

Если Вы считаете, что стоимость вызова WinAPI функции GetTickCount() равна стоимости загрузки константы 2, то сильно заблуждаетесь. Вобщем, сделали 200 млн вызовов функции GetTickCount().


Об оптимизаторе: сейчас в бете мы специально отключили практически все методы оптимизатора кода, чтобы протестировать базовый функционал.
 
Renat писал(а) >>

Если Вы считаете, что стоимость вызова WinAPI функции GetTickCount() равна стоимости загрузки константы 2, то сильно заблуждаетесь.


Об оптимизаторе: сейчас в бете мы специально отключили практически все методы оптимизатора кода, чтобы протестировать базовый функционал.

А зачем вообще звать эту функцию ? Если ее результат нужен только вычисления "а", которая тут же сразу после выхода из цикла зануляется. То есть оптимизатор, должен выкидывать этот код. То есть результат должен быть одинаковый и примерно равен нулю, ну там или времени пары маш комманд.

 
SProgrammer >>:

А зачем вообще звать эту функцию ? Если ее результат нужен только вычисления "а", которая тут же сразу после выхода из цикла зануляется. То есть оптимизатор, должен выкидывать этот код. То есть результат должен быть одинаковый и примерно равен нулю, ну там или времени пары маш комманд.

Дело в том, что оптимизатор не имеет права выбрасывать блоки, где идет вызов других функций (да еще и WinAPI). Кроме того, переменная b, изменяющаяся в циклах, используется в расчете скорости.

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