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'               


私はこのテスト自体があまり好きではありません。なぜなら、このテストでは同じ計算が1,000万回行われるからです。この場合、コンパイラがコードを最適化しようとして驚きを与えないという保証はない。
そしてこれらの値は21で割らなければならない。全部で21*10,000回の繰り返しがあるからだ。

しかし、このテストでも私の結論は確認された。しかし、私のプロセッサーはより新しく、したがって最新のパフォーマンス機能を最大限に使用しているようであり、したがって、より最新のものであるため、より客観的である。


他の人のこのテスト結果を見るのも面白いだろう。

 
fxsaber #:

フォーマットを見てみた。

おそらくスピードアップはできないだろう。スイッチの奇跡的なスピードについては聞いている。

スパース・スイッチでは奇跡的なスピードは出ない。

最も驚異的なスピードが出るのは、0から255まで1刻みのケースを持つスイッチだろう

 
Slava #:

スパース・スイッチは驚異的なスピードをもたらすわけではない。

最も驚異的なスピードが出るのは、0から255までのケースを1刻みで持つスイッチである。

ありがとう。

 
Nikolai Semko # :

あなたのテストの結果です:



私はこのテスト自体があまり好きではありません。なぜなら、このテストでは同じ計算が1000万回行われるからです。この場合、コンパイラがコードを最適化しようとして驚きを与えないという保証はない。
また、これらの値は21で割る必要がある。全部で21*10,000回の繰り返しがあるからだ。

しかし、このテストでも私の結論は確認された。しかし、私のプロセッサーはより新しく、したがって最新のパフォーマンス機能を最大限に使用しているようであり、したがって、より最新であるため、より客観的である。


他の人のこのテスト結果を見るのも面白いだろう。

ありがとう。

コンパイラ最適化なしの結果を投稿したのは昨日の深夜だった。

以下は、cpu='AVX2 + FMA3'で最適化を最大にした場合の結果である。


 
Nikolai Semko #:

このアルゴリズムの主な難点は、月の開始時刻を計算することである(緑色でハイライト)。

このコードで最も興味深いのは、議論ではほとんど触れられなかったことだ。

 
fxsaber #:

このコードで最も興味深いのは、議論ではほとんど触れられなかったことだ。

そこでは1年の始まりが1月1日ではなく3月1日になっている。
これはstackoverflowで見たヒントだ。良いアドバイスだった。
私は30.68の係数を見つけるためにスクリプトを書かなければならなかった。
 

非常に短いコード(15行未満)をmqh-libraryという形で保存する必要に迫られた。

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::f()は、Aクラスの子孫オブジェクトがコード内のどこにも生成されないという条件で、2番目のケースでもコンパイラによってインライン化されるのでしょうか?

 
ビジュアライザーの特定の場所にブレークポイントを作る必要があることがあります。そのために、私はこのような関数を使用しています。
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の動作を分析する。

理由: