defineの専門家に質問 - ページ 8

 
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=100000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2=r2/10;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<v; i++)
        { 
        r1+=v;
        r1=r1/10;
        }
     }
   
   int pi2 = sum*step;
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",pi," ",pi2);
// Templ();
  }

それでも、トップコードが勝つこともあるが、ごく稀に、つまりリンクが無料になることもある

 
Alexandr Andreev:

)まあそういうわけでもないんだけどね)


C++ではそのように動作します
mqlでも同じだと思いますが、MQからのラッパーが追加されています。


トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者からのFAQ MQL5 MT5 MetaTrader 5

ローマン 2019.12.11 14:02

よく考えなくても、なんで私が...。コンパイラが勝手にやってくれる。))
C# は C ではありません。

__inlineについての動画をご覧ください。
そこでは、機能で違いがわからない人のために、メモリーでどのように動くかを説明しています。


 
Roman:

C++ではこのように動作します
mqlでも同じだと思いますが、MQからのラッパーが追加されています。

まあ、今再読このスレッドと多くの文とテスト例 - いくつかの違いがあること。そして見つけたのです)))

 
Alexandr Andreev:

まあ今再読このスレッドと文とテストの例の束 - 違いがあること。そして、彼らはそうした))))

No )) 再読する気も起きない。
その差は歴然としていますね。

 
Roman:

No )) 再読する気も起きない。
その差は歴然としていますね。

)))もう一つのIMHO。

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=1000000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(int i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1); 
        r2++;
        r2=r2/100;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r1++;
        r1=r1/100;
        r1++;
        
        }
     }
    
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r2," ",r1);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

上側の方が15%近く速いというのは、非常に重要なことです。)


 
Alexandr Andreev:

))) 別のIMHO

トップ・ウェイの方が20%近く速いんだ、まあ、何もかもが明白なので説明してくれ)


比較されるループは、本体内のコードが同じではありません。
最初のループのボディには1つのコードがあり、2番目のループのボディには別のコードがあります。
当然、コードの命令も違えば、実行時間も違う。
ループ本体には同じコードを作り、ループ条件ArraySizeと 変数sizeだけを変更します。
私たちがテストしているのは、本体ではなく、この部分です。

 
Roman:

比較されるループは、本体内の同じコードではありません。
最初のループのボディには1つのコードがあり、2番目のループのボディには別のコードがあります。
当然ながら、コードの命令や実行時間は異なる。
ループ本体には同じコードを作り、ループ条件ArraySizeと変数sizeだけを変更します。
私たちがテストしているのは、本体ではなく、この部分です。

あなたのテストは、起動ケースに依存するため、より不正確です、もう一度実行してください。ここでは、どちらの場合も増分があり、1つの除算がある。まあ、それに加えて、数百 数十億のArraySizeの呼び出しが 追加されるわけですが。

ちなみに、テストする内容を書くのは本文の方です。繰り返されるのは身体だからです。ループに巻き込んで...結果を得ようとしています。つまり、本来は本体からArraySizeを呼び出す 必要があるのです

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 
Alexandr Andreev:

あなたのテストは、起動ケースに依存するため、より不正確です、もう一度実行してください。ここでは、両ケースともインクリメントと1つのディビジョンを持っています。まあ、それに加えて数 数十億のArraySizeの呼び出しが あるんだけどね。

ちなみに、テストする内容を書くのは本文の方です。繰り返されるのは身体だからです。ループに巻き込んで...結果を得ようとしています。つまり、当初は本体からArraySizeを呼び出す 必要があったのです

各反復において、ループの条件にはすでに i<ArraySize() または i<size
のチェックが含まれています。つまり、各反復において関数または変数のいずれかが呼び出されます。
なぜ、検査対象物を体内に入れる必要があるのでしょうか?

論理そのものが、どちらが早く処理できるかの判断を促しているのだ。関数に、または変数に。
コンパイラがどう呼ぼうが関係ない。コンパイラに頼らず、自分の常識で、リファレンスから見て何が速く処理できるかを考えています。

 
Roman:

各繰り返しでは、ループ条件において、i<ArraySize() または i<size
という条件がとにかくチェックされます。つまり、各繰り返しで関数か変数のどちらかが呼び出されることになるのです。
なぜ、検査対象物を体内に入れる必要があるのでしょうか?

なぜなら、私たちはこの機能を持つ幸運な人間であり、その機能は他のものでもよいからです。そして、それはまさにボディに配置される。異なるアレイに対応することで効果を高めようと、複製したに過ぎません。

しかし、計算の誤差が研究対象の効果を覆い隠してしまうような複雑な作業を追加するのは間違っています。ちなみに、μlではアセンブリが一定でない可能性もあります。つまり、再コンパイルすると微妙に異なるデータを得ることができます(これは正確ではありませんが、ハッキングに対する保護として使われているようなものです)ので、あなたのコードですべてをテストすることも可能です。結果が変わるかどうか見てみましょう。

Mclは、ビデオに示されているように、単にコードを代用しようとするだけです。まあそこはちょっと違うんですけどね。しかし、一般論として。

また、どのような値が得られるかわからない関数に対する指示は、jsやphp、その他の類似の言語がどのように動作するか、µlでさえこのように動作しますが、デバッグモードでのみ 動作します。

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Информация о запущенной MQL5-программе - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

各繰り返しでは、ループの条件において、i<ArraySize() または i<size
という条件がとにかくチェックされます。つまり、各繰り返しで関数か変数のどちらかが呼び出されることになるのです。
なぜ、検査対象物を体内に入れる必要があるのでしょうか?

論理そのものが、どちらが早く処理できるかの判断を促しているのだ。関数に、または変数に。
コンパイラがどう呼ぼうが関係ない。コンパイラに頼らず、常識に頼って、リファレンスから見て何が速く処理できるかを考えています。

いつもうまくいくわけではありません。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

defineの専門家に質問です。

ローマン さん 2020.11.02 19:44

投稿を変更しました。
つまり、ArraySizeの方がcntよりも高速になりました。
以前はその逆でした。多分、cntのインクリメントが影響していると思いますが、ループの本体も違うし、何か別の負荷の工夫が必要なのでしょう。

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < ArraySize(arr); i++) 
   {
      ArrayResize(arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:33:22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   int cnt = ArraySize(arr);
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < cnt; i++) 
   {
      ArrayResize(arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:56:26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms