Особенности языка mql5, тонкости и приёмы работы - страница 237

 
Alain Verleyen #:

Возможно, я что-то упускаю, но я использовал ваш скрипт для проверки PeriodSeconds (только).


мои результаты Вашего теста:

2023.11.15 00:26:58.896 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.78 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:26:59.056 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 16.03 наносекунд - PeriodSecondsFast
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.08 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:16.018 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:16.318 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.99 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:16.474 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.59 наносекунд - PeriodSecondsFast
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.74 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:25.206 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:25.508 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.14 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:25.666 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.77 наносекунд - PeriodSecondsFast
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 44.47 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:40.780 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:41.089 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.90 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:41.249 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.98 наносекунд - PeriodSecondsFast
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.72 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       ========================================================================

0 errors, 0 warnings, 234 msec elapsed, cpu='AVX2 + FMA3'               


сам тест мне не очень нравится, т.к. в тесте происходит 10 млн одних и тех же вычислений. В таком случае нет гарантии, что компилятор не выдаст сюрпризы в попытках оптимизации кода. 
А еще эти значения нужно делить на 21, т.к. всего 21*10 000 000 итераций.

Впрочем и этот тест подтверждает мои выводы, но для моего процессора, судя по всему более свежего и, стало быть, максимально использующего современные производительные фичи, и, поэтому более объективного из-за большей актуальности.


Интересно было бы посмотреть результаты этого теста у других.

 
fxsaber #:

Посмотрел формат.

Наверное, не ускорить. Слышал, правда, про чудесную скорость switch.

Разреженный switch не даёт чудесной скорости.

Самая чудесная скорость будет в свитче с кейсами от нуля до 255 с шагом 1

 
Slava #:

Разреженный switch не даёт чудесной скорости.

Самая чудесная скорость будет в свитче с кейсами от нуля до 255 с шагом 1

Спасибо.

 
Nikolai Semko # :

мои результаты Вашего теста:



сам тест мне не очень нравится, т.к. в тесте происходит 10 млн одних и тех же вычислений. В таком случае нет гарантии, что компилятор не выдаст сюрпризы в попытках оптимизации кода. 
А еще эти значения нужно делить на 21, т.к. всего 21*10 000 000 итераций.

Впрочем и этот тест подтверждает мои выводы, но для моего процессора, судя по всему более свежего и, стало быть, максимально использующего современные производительные фичи, и, поэтому более объективного из-за большей актуальности.


Интересно было бы посмотреть результаты этого теста у других.

Спасибо.

Вчера было уже поздно, когда я опубликовал результаты, БЕЗ оптимизации компилятора.

Вот результаты с cpu='AVX2 + FMA3' и максимальной оптимизацией.


 
Nikolai Semko #:

Главная сложность в этом алгоритме - это расчет времени начала месяца  (выделено зеленым цветом).

Самое интересное в коде и почти не затронутое в обсуждении.

 
fxsaber #:

Самое интересное в коде и почти не затронутое в обсуждении.

Там год начинается 1 марта, а не 1 января.
Этот совет я увидел в stackoverflow. Это был хороший совет. 
Пришлось написать скрипт для нахождения коэффициента 30.68
 

Столкнулся с необходимостью сохранения очень короткого кода (< 15 строк) в виде mqh-библиотеки.

template <typename T1, typename T2>
T1* New( const string &ClassName ) { return((typename(T2) == ClassName) ? new T2 : NULL); }

template <typename T1, typename T2>
T1* New( string ClassName, const T2 &FuncNew[] )
{  
  T1* Res = NULL;
  
#ifdef __MQL5__
  ClassName = "class " + ClassName;
#endif // #ifdef __MQL5__
  
  for (uint i = ArraySize(FuncNew); (Res == NULL) && (bool)i--;)
    Res = FuncNew[i](ClassName);  
    
  return(Res);
}

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

Сколь короткие библиотеки используете?

 
Сигнатура шаблонной функции может зависеть от мест расположения ее вызова.

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

Ошибки, баги, вопросы

fxsaber, 2023.11.26 23:26

template <typename T>
void Func( void ) { Print(__FUNCSIG__); }

void OnStart()
{
  Func<int>(); // void "void OnStart()"::Func<int>()
}
 

Если правильно понимаю, то в этом случае метод A::f() инлайнится в g().

class A
{
  void f() {}
  void g() { this.f(); }
};


А здесь - нет.

class A
{
  virtual void f() {}
  void g() { this.f(); }
};


Будет ли во втором случае A::f() инлайниться компилятором при условии, что нигде в коде не создаются объекты потомков класса A?

 
Иногда нужно сделать точку останова в определенном месте Визуализатора. Использую такую функцию для этого.
bool IsManualChangeTester()
{
  static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE);
  static ENUM_CHART_MODE PrevChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);  
  
  bool Res = false;
  
  if (IsVisual)
  {
    const ENUM_CHART_MODE ChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);
      
    if (Res = (ChartMode != PrevChartMode))
      PrevChartMode = ChartMode;
  }
    
  return(Res);
}


С таким применением.

if (IsManualChangeTester())
  DebugBreak();


Когда нужно создать это условие, просто меняю режим отображения графика в визуализаторе.

И дальше уже анализирую поведение советника в ME.