Новая версия платформы MetaTrader 5 build 4570: улучшения веб-версии и интеграция с OpenBLAS в MQL5 - страница 7

 

Можно ли это считать корректным тестом скорости?

  matrix b={{2.8, 1.6,0}, {3.6, 2.4,0}, {2.0, 2.8,0}};
  matrix U, V;
  vector s;
  ulong t=GetMicrosecondCount();
  bool f=true;
  for(int i=0;i<1000000;i++){
  //f=b.SVD(U, V, s);
  f=b.SingularValueDecompositionQR(SVDZ_A,SVDZ_A,s,U,V); 
  //f=b.SingularValueDecompositionDC(SVDZ_A,s,U,V); 
  if(!f) break;
  }
  if(!f) Print(f);
  Print(GetMicrosecondCount()-t);
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета-версия платформы MetaTrader 5 build 4540: улучшения веб-версии и интеграция с OpenBLAS в MQL5

Rorschach, 2024.09.25 22:49

Можно ли это считать корректным тестом скорости?

  matrix b={{2.8, 1.6,0}, {3.6, 2.4,0}, {2.0, 2.8,0}};
  matrix U, V;
  vector s;
  ulong t=GetMicrosecondCount();
  bool f=true;
  for(int i=0;i<1000000;i++){
  //f=b.SVD(U, V, s);
  f=b.SingularValueDecompositionQR(SVDZ_A,SVDZ_A,s,U,V); 
  //f=b.SingularValueDecompositionDC(SVDZ_A,s,U,V); 
  if(!f) break;
  }
  if(!f) Print(f);
  Print(GetMicrosecondCount()-t);
Выделенное удалите, чтобы не замерять Print.
 
Rorschach #:

Можно ли это считать корректным тестом скорости?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   matrix b = {{2.8, 1.6,0}, {3.6, 2.4,0}, {2.0, 2.8,0}};
   matrix U, V;
   vector s;
   
   int   n       = 1000000;
   ulong start   = 0;
   bool  f       = false;
   ulong sum     = 0;
   ulong avgTime = 0;
   
   for(int i=0; i<n && !_StopFlag; i++)
   {
      start = GetTickCount();
      
      //f=b.SVD(U, V, s);
      //f=b.SingularValueDecompositionQR(SVDZ_A,SVDZ_A,s,U,V); 
      f=b.SingularValueDecompositionDC(SVDZ_A,s,U,V); 
      
      sum += GetTickCount()-start;
      
      switch(f)
      {
         case 0:
            Print("f == false");
            return;
         default:
            break;
      }
   }
   
   avgTime = sum/n;
      
   Print("Среднее время ", avgTime, " миллисекунд"); 

}
 
Roman #:

Вы сравнивали время? У меня SVD() получилась на порядок быстрее!?

 
Rorschach #:

Можно ли это считать корректным тестом скорости?

Т.к. входные данные не меняются, компилятор теоретически может оптимизировать цикл. Надо внести изменчивость входных данных.

 
Edgar Akhmadeev #:

Т.к. входные данные не меняются, компилятор теоретически может оптимизировать цикл. Надо внести изменчивость входных данных.

а так как цикл ещё и длительный, то всё вольготно ляжет в кеши и результат категорически разойдётся с реальностью..если 100500 итераций цикла делается за N сек, это совсем не значит что начальные (или даже просто отдельные) итерации занимают N/100500. 

к разнообразию данных, неплохо-бы ещё кеш инвалидить, переключать контексты, считать разброс или хотя-бы "время в лучшем/в худшем случае"

 
Maxim Kuznetsov #:
неплохо-бы ещё кеш инвалидить

Кстати, неплохо было бы, если кто-то, кто в теме, предложил бы функцию ResetCpuCache(). Очень пригодилась бы в бенчмарках.

Как вносить вариативность в данные, уже разобрано, когда соревновались в самых быстрых алгоритмах по датам.

 
b4550, разное поведение компилятора.
input bool inFlag = "true"; // WARNING: implicit conversion from 'string' to 'bool'
bool Flag = "true";         // ERROR:   cannot implicitly convert type 'string' to 'bool'
Строка для поискаOshibka 116.
 
Roman #:

Через GetTickCount нельзя замерять малые тайминги из-за погрешностей этой устаревшей функции.

Используйте https://www.mql5.com/ru/docs/common/getmicrosecondcount

Документация по MQL5: Общие функции / GetMicrosecondCount
Документация по MQL5: Общие функции / GetMicrosecondCount
  • www.mql5.com
Функция GetMicrosecondCount() возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы. Возвращаемое значение Значение...
 
Сейчас мы работаем над новым компилятором и поэтому проблемы текущего компилятора не трогаем.