Библиотеки: Benchmark - страница 2

 
Igor Makanu:

вот тесты на ВПС , вроде такая же ситуация

Там, вроде, обратная ситуация. Но тоже врет.

Попробовал такие режимы ОС.

bcdedit /set useplatformclock false
bcdedit /set disabledynamictick yes
bcdedit /set useplatformclock true
bcdedit /set disabledynamictick no

Не помогло. На более старых ОС официально другой вариант предлагается, но у меня ОС новее.

 

Где использовать?

Полезно при поиске узких мест производительности. Позволяет быстро вставить замер в интересуемые участки исходного кода. Выявить провалы производительности при длительной работе MQL-программ.


В тонких местах лучше так делать.

#define Alert Print // Избавляемся от тормозов штатной Alert
  #include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279
#undef Alert
 

Любителям запятых в Print/Alert: произвольное количество входных переменных функции.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick()
{  
  int a = 0, b = 1, c = 2, d = 3;
  
  
  _BV(
  Print(a, ", ", b, ", ",c, ", ",d, ", ");
      , 1)

  _BV(
  Print((string)a + ", " + (string)b + ", " + (string)c + ", " + (string)d + ", ")
      , 1)
}


Результат.

2020.10.07 15:04:56.208 0, 1, 2, 3, 
2020.10.07 15:04:56.208 Alert: Bench_Stack = 0, Time[Test9.mq5 12: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 4 mсs.
2020.10.07 15:04:56.422 0, 1, 2, 3, 
2020.10.07 15:04:56.422 Alert: Bench_Stack = 0, Time[Test9.mq5 8: Print(a,, ,b,, ,c,, ,d,, );] = 41 mсs.
2020.10.07 15:04:56.422 0, 1, 2, 3, 
2020.10.07 15:04:56.422 Alert: Bench_Stack = 0, Time[Test9.mq5 12: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 7 mсs.
2020.10.07 15:04:56.654 0, 1, 2, 3, 
2020.10.07 15:04:56.654 Alert: Bench_Stack = 0, Time[Test9.mq5 8: Print(a,, ,b,, ,c,, ,d,, );] = 35 mсs.


Дешевле строку самому формировать.

 
fxsaber:

Любителям запятых в Print/Alert: произвольное количество входных переменных функции.

Результат.

Дешевле строку самому формировать.

проверил Ваш пример у себя, но в скрипте:

2020.10.08 06:40:19.244 tst (EURUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2020.10.08 06:40:19.244 tst (EURUSD,H1) 0, 1, 2, 3, 

2020.10.08 06:40:19.245 tst (EURUSD,H1) Alert: Time[tst.mq5 14: Print(a,, ,b,, ,c,, ,d,, );] = 13 mсs.

2020.10.08 06:40:19.245 tst (EURUSD,H1) 0, 1, 2, 3, 

2020.10.08 06:40:19.245 tst (EURUSD,H1) Alert: Time[tst.mq5 18: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 11 mсs.

2020.10.08 06:40:37.015 tst (EURUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2020.10.08 06:40:37.015 tst (EURUSD,H1) 0, 1, 2, 3, 

2020.10.08 06:40:37.015 tst (EURUSD,H1) Alert: Time[tst.mq5 14: Print(a,, ,b,, ,c,, ,d,, );] = 11 mсs.

2020.10.08 06:40:37.015 tst (EURUSD,H1) 0, 1, 2, 3, 

2020.10.08 06:40:37.015 tst (EURUSD,H1) Alert: Time[tst.mq5 18: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 11 mсs.

запустил 2 раза

почему так сильно отличаются результаты? - у меня 11-13 , у Вас 35-41

 
Igor Makanu:

проверил Ваш пример у себя, но в скрипте:

почему так сильно отличаются результаты? - у меня 11-13 , у Вас 35-41

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{    
  int a = 0, b = 1, c = 2, d = 3;  

  for (int i = 0; i < 5; i++)    
  {
    _BV( Print(a, ", ", b, ", ",c, ", ",d, ", "), 1)
    
    Sleep(100); // Если убрать, Print будет работать быстрее.
  }
}


Со Sleep.

2020.10.08 08:06:38.020 0, 1, 2, 3, 
2020.10.08 08:06:38.020 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 4 mcs.
2020.10.08 08:06:38.126 0, 1, 2, 3, 
2020.10.08 08:06:38.126 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 46 mcs.
2020.10.08 08:06:38.235 0, 1, 2, 3, 
2020.10.08 08:06:38.235 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 51 mcs.
2020.10.08 08:06:38.345 0, 1, 2, 3, 
2020.10.08 08:06:38.345 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 46 mcs.
2020.10.08 08:06:38.454 0, 1, 2, 3, 
2020.10.08 08:06:38.454 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 33 mcs.


Без Sleep.

2020.10.08 08:06:50.202 0, 1, 2, 3, 
2020.10.08 08:06:50.202 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 5 mcs.
2020.10.08 08:06:50.202 0, 1, 2, 3, 
2020.10.08 08:06:50.202 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 4 mcs.
2020.10.08 08:06:50.202 0, 1, 2, 3, 
2020.10.08 08:06:50.202 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 4 mcs.
2020.10.08 08:06:50.202 0, 1, 2, 3, 
2020.10.08 08:06:50.202 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 3 mcs.
2020.10.08 08:06:50.202 0, 1, 2, 3, 
2020.10.08 08:06:50.202 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnStart: Print(a,, ,b,, ,c,, ,d,, )] = 3 mcs.
 
думаю, что память для скрипта и для ЕА по разному выделяется терминалом, по крайней мере точно помню был вопрос про МТ4, где у пользователя код с со статически распределенном массивом не работал в скрипте, но работал в ЕА - решение было динамический массив, тогда и в скрипте код заработал
fxsaber:

Со Sleep.

Без Sleep.

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

 
Igor Makanu:
думаю, что память для скрипта и для ЕА по разному выделяется терминалом, по крайней мере точно помню был вопрос про МТ4, где у пользователя код с со статически распределенном массивом не работал в скрипте, но работал в ЕА - решение было динамический массив, тогда и в скрипте код заработал

Причина в другом.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick()
{  
  int a = 0, b = 1, c = 2, d = 3;
    
  Print(""); // Установили связь с Print-снепшотом.
  
  _BV(
  Print((string)a + ", " + (string)b + ", " + (string)c + ", " + (string)d + ", ")
      , 1)  
  
  _BV(
  Print(a, ", ", b, ", ",c, ", ",d, ", ");
      , 1)
}


Результат.

2020.10.08 08:20:03.786 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnTick: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 7 mcs.
2020.10.08 08:20:03.787 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 13 in OnTick: Print(a,, ,b,, ,c,, ,d,, );] = 6 mcs.
2020.10.08 08:20:03.989 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnTick: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 8 mcs.
2020.10.08 08:20:03.989 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 13 in OnTick: Print(a,, ,b,, ,c,, ,d,, );] = 7 mcs.
2020.10.08 08:20:04.189 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 9 in OnTick: Print((string)a+, +(string)b+, +(string)c+, +(string)d+, )] = 7 mcs.
2020.10.08 08:20:04.189 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 13 in OnTick: Print(a,, ,b,, ,c,, ,d,, );] = 7 mcs.


fxsaber:

Любителям запятых в Print/Alert: произвольное количество входных переменных функции.

Дешевле строку самому формировать.

Это ошибочный результат.

 

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

Софтина для измерения/изменения частоты таймера. Проверить на вирусы можно здесь.

upd статья по таймерам.

 

в биосах многих плат есть опция повышения точности таймера, к своему Ryzen не нашел, может вообще только интел

HPET (англ. High Precision Event Timer

 
Rorschach #:

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

Софтина для измерения/изменения частоты таймера. Проверить на вирусы можно здесь.

upd статья по таймерам.

Свежая статья по таймерам