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'               


我不太喜欢测试本身,因为测试中进行了 1000 万次相同的计算。在这种情况下,无法保证编译器在优化代码时不会出现意外。
而这些值必须除以 21,因为总共有 21*10 000 000 次迭代。

不过,这个测试也证实了我的结论,但针对的是我的处理器,因为我的处理器似乎更新颖,因此最大限度地使用了现代性能特性,也因此更客观,因为它更与时俱进。


我很想知道其他人的测试结果。

 
fxsaber #:

看了一下格式。

可能不会加快速度。不过,我听说了开关的神奇速度。

稀疏切换不会带来奇迹般的速度。

最惊人的速度将出现在以 1 为增量、从 0 到 255 的开关中。

 
Slava #:

稀疏开关不会带来惊人的速度。

最令人惊叹的速度将出现在以 1 为增量、从 0 到 255 的开关中。

谢谢。

 
Nikolai Semko # :

我的测试结果



我不太喜欢测试本身,因为测试中出现了 1000 万次相同的计算。在这种情况下,无法保证编译器在试图优化代码时不会出现意外。
而这些值应该除以 21,因为总共有 21*10 000 000 次迭代。

不过,这个测试也证实了我的结论,但针对的是我的处理器,它似乎更新颖,因此最大限度地使用了现代性能特性,也因此更客观,因为它更与时俱进。


我很想知道其他人的测试结果。

谢谢。

昨天我发布不带编译器优化的结果时已经很晚了。

下面是使用 cpu='AVX2 + FMA3' 和最大优化时的结果。


 
Nikolai Semko #:

这种算法的主要难点在于计算月份的开始时间(以绿色标出)。

这是代码中最有趣的地方,在讨论中几乎没有涉及。

 
fxsaber #:

代码中最有趣的事情,在讨论中几乎没有触及。

在这里,一年的开始时间是 3 月 1 日,而不是 1 月 1 日。
这是我在 stackoverflow 上看到的提示。这是个很好的建议。
我不得不写一个脚本来找到 30.68 因子
 

我必须以 mqh-library 的形式保存非常简短的代码(< 15 行)。

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);
}

这是被迫采取的措施,因为指向函数的指针只能指向全局 scopus 中的函数。

您使用的库有多短?

 
模板函数的签名可能取决于其调用的位置。

交易、自动交易系统和交易策略测试论坛

错误、错误、问题

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 类的后代对象,编译器是否会将 A::f() 内联?

 
有时您需要在展示台的某个位置设置断点。为此,我使用了这样一个函数。
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 中分析 Expert Advisor 的行为。