mql5言語の特徴、微妙なニュアンスとテクニック - ページ 118

 
Optimize=1だとFastLog2の動作が速くなるんですね、奇跡です・・・C++で確認しないと。
 
Alexey Navoykov:

ちなみに、ゼロについてですが、FastLog2はゼロをチェックしないので、頭打ちになります。しかし、正しくテストした場合、log2より1.5〜2倍遅くなります)。

そして、それのどこが不正解なのか。

なぜなら、あなたのバージョンのテストでも、生成されるからです。

2019.01.05 04:43:12.372 TestLog (EURUSD,H1)     Result log2:       sum=1400005128  time=297 ms
2019.01.05 04:43:12.635 TestLog (EURUSD,H1)     Result log2_:      sum=1400018381  time=262 ms
2019.01.05 04:43:12.809 TestLog (EURUSD,H1)     Result _FastLog2:  sum=1400004095  time=174 ms
 
Alexey Navoykov:

ちなみに、ゼロについてですが、FastLog2はゼロをチェックしないので、頭打ちになります。しかし、正しくテストした場合、log2の1.5〜2倍遅いままです)。

もちろん、log2からゼロチェックを削除するか、FastLog2に同じものを追加する必要があります。

問題は、本当に計算部分のスピードなんです。log2では、すべてがシフトと足し算だけで計算されます。FastLog2 は、乗算を含む巧妙な変換を行った後、テーブル値を使用します。このコードは非常に古く、数学コプロセッサの時代に使われていたもので、状況は当時と変わっているかもしれません。

 
C++で確認しました。 はい、FastLog2は確かに最速です。賢いコードですね )おそらく、比較演算よりもビット演算の方がはるかに高速だからだろう。
 
MT4で全てのコードをテストしてみました。MT4では、コンパイラは最適化を行わず(つまり、sumを含むバリアントはsumを含まない私のオリジナルのバリアントと同じ相対結果を示します)、MT4ではlog2はFastLog2よりも高速に実行されます。また、MT5ではすでにサミングなしの最適化(つまり、コードが完全に実行されない)があり、FastLog2バリアントはlog2より高速です。そこからどのような結論が導き出されるかは、コードオプティマイザがどのように機能するかの詳細があちこちに書かれていないため、私にはわかりません。
 
void f(){
  static int a[]; 
  Print("a[]=",ArraySize(a)); 
  ArrayResize(a, 100); 
  Print("a[]=",ArraySize(a));}


class A
 {
public: A(){ f(); }
 };
 
A _a;

void OnStart()
  {

  }


 
Ilya Malev:

これはMQL5の標準的な動作で、静的変数はグローバル変数の後に来ます。

このため、非常に深刻な混乱に陥ることがあります。
 
fxsaber:

これはMQL5の標準的な動作で、スタティック変数はグローバル変数の後に開始されます。

クラス/構造体のすべての静的変数が構造体自身の後で宣言されなければならないのはそのためでしょうか。そして、そこに価値を見出さずとも...。もしかしたら、コンパイラがすべて自動的に行うように提案すべきかもしれませんね。

 

これは本質的にはバグであり、プログラムコードの実行順序が正しくないということです。コンパイラは原則的にこれを許さないはずです。 これについては、もっと開発者に怒鳴るべきです。

C++では、コードはコンパイラによって上から下へと厳密に処理されるので、上のコードはすべて初期化済みです。 そして、下のコードにアクセスすることはできません。せっかく開発者が独自のルールを導入したのだから、正しいコード実行順序を提示させればいい。

 
Alexey Navoykov:

C++では、コードはコンパイラによって上から下へと厳密に処理されるため、上にあるものはすでに初期化されています。 そして、下のものにはアクセスできません。だから、すべてがクリアなのです。

自由度が低い。