Новая версия платформы MetaTrader 5 build 3980: Улучшения и исправления - страница 6

 

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

// Заполнение счетчиком.
void Fill1( matrix<double> &Matrix )
{
  uint Count = 0;
  
  for (ulong i = Matrix.Rows(); (bool)i--;)
    for (ulong j = Matrix.Cols(); (bool)j--;)
      Matrix[i][j] = Count++;
}

// Заполнение счетчиком.
void Fill2( matrix<double> &Matrix )
{    
  const int Rows = (int)Matrix.Rows();
  const int Cols = (int)Matrix.Cols();

  double Array[];
  Matrix.Swap(Array);

  for (uint i = ArraySize(Array), Count = 0; (bool)i--;)
    Array[i] = Count++;
    
  Matrix.Swap(Array);
  Matrix.Init(Rows, Cols);
}

// Заполнение числом.
void Fill( matrix<double> &Matrix, const double Value )
{    
  const int Rows = (int)Matrix.Rows();
  const int Cols = (int)Matrix.Cols();

  double Array[];
  Matrix.Swap(Array);

  ArrayInitialize(Array, Value);
    
  Matrix.Swap(Array);
  Matrix.Init(Rows, Cols);
}

#define BENCH(A)                                                              \
  StartTime = GetMicrosecondCount();                                          \
  A;                                                                          \
  Print(#A + " - " + (string)(GetMicrosecondCount() - StartTime) + " mcs."); 

void OnStart()
{
  matrix<double> Matrix;  
  Matrix.Init(1000, 1000);
  
  ulong StartTime;

  Matrix.Fill(0); // Разогрев.
  
  // Заполнение числом.
  BENCH(Matrix.Fill(0))
  BENCH(Fill(Matrix, 0)) // Быстрее.

  // Заполнение счетчиком.
  BENCH(Fill1(Matrix))
  BENCH(Fill2(Matrix)) // Быстрее.
}


Результат.

Matrix.Fill(0) - 851 mcs.
Fill(Matrix, 0) - 589 mcs.

Fill1(Matrix) - 1175 mcs.
Fill2(Matrix) - 948 mcs.

matrix::Fill-метод работает медленнее самоделки.

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


Просьба подумать над ускорением.

Строка для поиска: Uluchshenie 072.
 
fxsaber #:
b3891, Пирсон больше единицы. Строка для поиска: Uluchshenie 071.

Насколько больше?

TestCorrCoeff (EURUSD,D1)   1.0000000000000002

Добро пожаловать (в который раз?) в мир вещественных вычислений

 
Slava #:

Добро пожаловать (в который раз?) в мир вещественных вычислений

В курсе. Либо делаете проверку, либо нет.

 
fxsaber #:
b3891, Пирсон больше единицы. Строка для поиска: Uluchshenie 071.

А где доказательство? На этом форуме Разработчики уже столько раз твердили про сравнение double, что для завсегдатая - это явное к ним неуважение

 
Renat Fatkhullin #:

Приведите конфигурацию из стартового баннера в логах терминала, пожалуйста.

Можете легче обьяснить? Та же проблема просто не совсем понимаю что делать.