Jump to content

Течение времени внутри фунукции Start()


Recommended Posts

Den2S

Течение времени внутри фунукции Start()

 

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

Для чего выполнял несколько тысяч однотипных операций и вычитал из конечного времени начальное.

 

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

 

 

Однако поприменяв всякие временные функции из MQL4 добиться движения времени в тестере не получилось. Все время показывает одно и то же время. Что на сервере что на локальном терминале.

Т.е никакого движения времени не происходит.

 

- Как быть? Откуда снять изменение времени в процессе выполнения одного цикла функции start()?

 

Вот- наглядно видно что в процессе выполнения старта время не течет:

 

int P,di=0, i=0,n=0,m,s;

datetime t;

 

//----------------------------------------------------------------------------------------------------------------

int start()

{

P=Seconds();// Minute();

t=TimeLocal();

 

m = TimeMinute(TimeLocal());

s = TimeSeconds(TimeLocal());

 

 

while (di<60000)

{ i++; n++; di++;

if (n==10)

{

P=Seconds();// Minute();

t=TimeLocal();

 

m = TimeMinute(TimeLocal());

s = TimeSeconds(TimeLocal());

 

Print ("di=",di, " t=", t, " m=", m, " s=", s);

n=0;

}

}

//------------------------------------------------------------------------------------------------

return(0);

}


Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
Ugar68

В тестере локальное приравнивается к терминальному.

Моделируется тик с временем. В начале и в конце функции старт время одинаковое.

Для тестера функция старт выполняется мгновенно.

Для проверки работы в тестере надо засекать время в инит и вычислят время теста и печатать в журнал в деинит. Но тогда на измерение производительности сильно будет влиять производительность самого тестера.

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


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Den2S

Ну а что - внутри старта время что ли останавливается?

 

Оно же ведь идет в системных часах на материнской плате в южном мосту.

 

Значит должны быть какие-то способы его извлечения в советник.=;

 

 

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

Как по вашему - сколько операций Print("Здесь жил и отжил Новый Год!");

может отрабатывать советник за секунду?

 

 

или , например,

 

if ( p < z ) { n++ ; } ?

 

 

или же

 

if ( p != z ) { z++ ; } ?

 

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

Какой цикл и во сколько раз работает быстрее - for или while ?

Edited by Den2S

Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
Ugar68

Внутри функции старт время не останавливается. В тестере время не идёт, оно моделируется. Тестеру не надо моделировать время внутри функции старт.

 

На моём компе 1 000 000 раз выполнить Print("Здесь жил и отжил Новый Год!"); занимает 1732 ms. То есть 1,732 секунды. Это ещё учесть что работал цикл с 1000000 проходов и таким же количество приращений индексной переменной.

Это дисковая операция, да ещё и строковая, по этому тормозная.

Сравнивать while и for или простую арифметическую операцию приращения, нет смысла. Будет на уровне погрешности.

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Den2S
Внутри функции старт время не останавливается. В тестере время не идёт, оно моделируется. Тестеру не надо моделировать время внутри функции старт.

 

На моём компе 1 000 000 раз выполнить Print("Здесь жил и отжил Новый Год!"); занимает 1732 ms. То есть 1,732 секунды. Это ещё учесть что работал цикл с 1000000 проходов и таким же количество приращений индексной переменной.

Это дисковая операция, да ещё и строковая, по этому тормозная.

 

- Код советника считающего скорость выполнения операции Print в студею!

 

Сравнивать while и for или простую арифметическую операцию приращения, нет смысла. Будет на уровне погрешности.

 

Эт зря вы так считаете. Между ними есть большая разница в скорости выполнения, так как один работает с автоприбавлением а другой с вычислением логического выражения. И последняя операция всегда выполнялась процессорами в сто-тысячу раз медленнее.

От того и возник вопрос расчета их реальной производительности в коде программы и отыскания тормозящих выполнение элементов кода советника.


Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
Ugar68

Зачем советник? Скрипт работает и в выходные.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
//---
  uint Start, i, ret1, ret2;
  Start=GetTickCount();
  for(i=0; i<1000000; i++)
     {
     Print("Здесь жил и отжил Новый Год!");
     }
  ret1=GetTickCount()-Start;

  //
  Start=GetTickCount();
  i=0;
  while(i<1000000)
     {
     i++;
     Print("Здесь жил и отжил Новый Год!");
     }
  ret2=GetTickCount()-Start;
  Print("Время выполения ms ",ret1," for");
  Print("Время выполения ms ",ret2," while");
 }

В цикле while есть логическое выражение разрешающее продолжать цикл.

Но в нём нет счётчика итераций. Что бы организовать определённое количество интераций придётся организовать счётчик.

цикл for содержит логическое выражение и счётчик интераций.

Никакой разницы в количестве операций между двумя циклами я не вижу.

int i=0;

while(i<1000000)i++;

//-----------------------

for(int i; i<1000000; i++)

 

Возможно они организованы по разному на более низком уровне, это может повлиять на скорость. Но не стоит грузиться, разница в десятки наносекунд на каждую интерацию. То есть сотые доли секунды при 1 000 000 интераций. Это точно не может вызвать тормоза.

Тормоза не вызывают простые логические выражения и простые арифметические операции такие как приращение.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
AntFX

По-моему, 1000000 раз записывать строку в лог не лучшее решение для проверки производительности. Тогда уж файл создавать, писать туда сколько нужно и стирать потом.


1

Link to post
Share on other sites
Ugar68
По-моему, 1000000 раз записывать строку в лог не лучшее решение для проверки производительности. Тогда уж файл создавать, писать туда сколько нужно и стирать потом.

Ну может чел хочет узнать сколько времени пишется именно в лог.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Den2S

Что-то я не понял.

 

Скрипт заканчивает работу в несколько мгновений сек, о чем извещает сигналом с колонок, и после еще несколько десятков сек в журнал выводятся строчки про Новый год.

 

Тут я не понял - что считать временем выполнения скрипта - до момента пика динамиков или до момента окончания вывода в журнал?

 

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

У меня по вашему скрипту получились значения 1358 для while и

1404 для for

Это за милисекунду столько?

Edited by Den2S

Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
Den2S

тут переделал немного и получилось что цикл с суммированием двух чисел

выполняется в 3 раза медленнее чем со сравнением 2-х чисел:

т.е. имеем что операция сравнения выполняется в три раза быстрее чем операция сложения/вычитания.

 

Как-то странно получается. Должно быть наоборот.

 

int P,di=0, i=0;

int N=1000000000;

double temp;

//+------------------------------------------------------------------+

//| Script program start function |

//+------------------------------------------------------------------+

void OnStart()

{

//---

uint Start, i, ret1, ret2;

Start=GetTickCount();

for(i=0; i<N; i++)

{

//Print("Здесь жил и отжил Новый Год!");

temp=di+P;

}

ret1=GetTickCount()-Start;

 

//

Start=GetTickCount();

i=0;

while((i<N))

{

i++;

if (temp>=di) di=1;// temp=di+P;

//Print("Здесь жил и отжил Новый Год!");

}

ret2=GetTickCount()-Start;

 

Print("Время выполения ms ",ret1," for", "Операций в 1 ms=", (N/ret1) );

Print("Время выполения ms ",ret2," while", "Операций в 1 ms=", (N/ret2) );

}

 

int init()

{ OnStart();}

 

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

итог - 141тыс с копейками раз успевает складывать за миллисекунду и

и 424 тыс с копейками сравнивать.

 

А значение синуса считает еще в 4-5 раз медленее - всего 38,5 тыс раз в миллисекунду.

 

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

 

на тестере в смысле, не в реале.

Edited by Den2S

Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
  • Capman locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...