Den2S 131 Share Posted March 30, 2014 Течение времени внутри фунукции 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 372 Share Posted March 30, 2014 В тестере локальное приравнивается к терминальному. Моделируется тик с временем. В начале и в конце функции старт время одинаковое. Для тестера функция старт выполняется мгновенно. Для проверки работы в тестере надо засекать время в инит и вычислят время теста и печатать в журнал в деинит. Но тогда на измерение производительности сильно будет влиять производительность самого тестера. Время выполнения какой то функции или операции надо мерить в реале, а не в тестере. Только точность до секунд слишком грубо. Надо переходить на миллисекунды. Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Den2S 131 Author Share Posted March 30, 2014 (edited) Ну а что - внутри старта время что ли останавливается? Оно же ведь идет в системных часах на материнской плате в южном мосту. Значит должны быть какие-то способы его извлечения в советник. ---------------- Как по вашему - сколько операций Print("Здесь жил и отжил Новый Год!"); может отрабатывать советник за секунду? или , например, if ( p < z ) { n++ ; } ? или же if ( p != z ) { z++ ; } ? -------------------------------------- Какой цикл и во сколько раз работает быстрее - for или while ? Edited March 30, 2014 by Den2S Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё. (Касается любого инвестирования в памм-индустрии). Den2S (©) Link to post Share on other sites
Ugar68 372 Share Posted March 30, 2014 (edited) Внутри функции старт время не останавливается. В тестере время не идёт, оно моделируется. Тестеру не надо моделировать время внутри функции старт. На моём компе 1 000 000 раз выполнить Print("Здесь жил и отжил Новый Год!"); занимает 1732 ms. То есть 1,732 секунды. Это ещё учесть что работал цикл с 1000000 проходов и таким же количество приращений индексной переменной. Это дисковая операция, да ещё и строковая, по этому тормозная. Сравнивать while и for или простую арифметическую операцию приращения, нет смысла. Будет на уровне погрешности. Edited March 30, 2014 by Ugar68 Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Den2S 131 Author Share Posted March 30, 2014 Внутри функции старт время не останавливается. В тестере время не идёт, оно моделируется. Тестеру не надо моделировать время внутри функции старт. На моём компе 1 000 000 раз выполнить Print("Здесь жил и отжил Новый Год!"); занимает 1732 ms. То есть 1,732 секунды. Это ещё учесть что работал цикл с 1000000 проходов и таким же количество приращений индексной переменной. Это дисковая операция, да ещё и строковая, по этому тормозная. - Код советника считающего скорость выполнения операции Print в студею! Сравнивать while и for или простую арифметическую операцию приращения, нет смысла. Будет на уровне погрешности. Эт зря вы так считаете. Между ними есть большая разница в скорости выполнения, так как один работает с автоприбавлением а другой с вычислением логического выражения. И последняя операция всегда выполнялась процессорами в сто-тысячу раз медленнее. От того и возник вопрос расчета их реальной производительности в коде программы и отыскания тормозящих выполнение элементов кода советника. Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё. (Касается любого инвестирования в памм-индустрии). Den2S (©) Link to post Share on other sites
Ugar68 372 Share Posted March 30, 2014 Зачем советник? Скрипт работает и в выходные. //+------------------------------------------------------------------+ //| 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 6,474 Share Posted March 30, 2014 По-моему, 1000000 раз записывать строку в лог не лучшее решение для проверки производительности. Тогда уж файл создавать, писать туда сколько нужно и стирать потом. 1 Link to post Share on other sites
Ugar68 372 Share Posted March 30, 2014 По-моему, 1000000 раз записывать строку в лог не лучшее решение для проверки производительности. Тогда уж файл создавать, писать туда сколько нужно и стирать потом. Ну может чел хочет узнать сколько времени пишется именно в лог. 1 Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Den2S 131 Author Share Posted March 30, 2014 (edited) Что-то я не понял. Скрипт заканчивает работу в несколько мгновений сек, о чем извещает сигналом с колонок, и после еще несколько десятков сек в журнал выводятся строчки про Новый год. Тут я не понял - что считать временем выполнения скрипта - до момента пика динамиков или до момента окончания вывода в журнал? ------------------------------- У меня по вашему скрипту получились значения 1358 для while и 1404 для for Это за милисекунду столько? Edited March 30, 2014 by Den2S Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё. (Касается любого инвестирования в памм-индустрии). Den2S (©) Link to post Share on other sites
Den2S 131 Author Share Posted March 30, 2014 (edited) тут переделал немного и получилось что цикл с суммированием двух чисел выполняется в 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 March 30, 2014 by Den2S Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё. (Касается любого инвестирования в памм-индустрии). Den2S (©) Link to post Share on other sites
Recommended Posts