エラー、バグ、質問 - ページ 2880

 
Igor Makanu:

ノー

繰り返しのコード部分があれば、最適化テストを受けることができます

rand()の実行時間にはどんな違いがあるのでしょうか?

テスト時間の2/3を実行させ、rand()の時間を一定にするのがポイント

MQLコードは、システムのMQL-functionsを使用するのですよね?- 完璧なコードをテストすることに何の意味があるのでしょうか?

)) 速度の差は、どちらかの方法が4倍有利になる可能性がありますが (1〜4)、rand 演算は他のコードより10倍遅いので、この差は目に見えません (11〜14)

 
Alexandr Andreev:

)) 速度の差は、どちらかの方法が4倍有利であったかもしれません(1~4)が、この演算は 他のコードより10倍長いため、この差は目に見えないでしょう(11~14)

ちゃらっぽこ

その差は一目瞭然

開発者が発表したイノベーションの中で、ある関数の時系列へのアクセス時間が最適化された=長い間チェックされていない、とよく書かれていることを確認しましょう。

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

一顧だにしない

rand() の実行時間は一定で、一般的なC++関数である可能性が高い。"rand c++ source code "でググってみてください。

は初期化する必要がありますが、定数で初期化すると最適化に遭遇する可能性があります。

一般に、rand()が嫌われるのは理解できない。

というような初期化も可能です。

は速いだろう。


は、あなたのスクリプトを実行しましたが、正しくありません。

主な時間は、コードをキャッシュにロードし、プロセッサにロードすることです

を追加し、システムタイマーの離散性

うーんほぼ乱数

100500回くらいテストしてください。


私のコンピュータでは、1回のループの繰り返しに約1.5ナノ秒かかります。

2つのrand()を使用した場合、1回の反復にかかる時間は2倍、最大で3ナノ秒近くになります。この繰り返しでは、大きな配列の1項目への2回のアクセスが消滅し、それもかなり高価であることを認識する必要があります。
全反復時間の約2/3が2つのrand()に費やされていることになる。もちろん、「桁違い」に少し興奮しました ))

あらかじめ用意された配列に乱数を入れると最適化に走るというのは理解できない。

すでに一度rand()の性能について議論されています。自分でも似たような機能を書いてみたりもしました。https://www.mql5.com/ru/forum/170952/page137#comment_12010041。

#define  Num 10000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

出来栄え

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

要は、ユニオンを使ってもバイナリシフトを使ってもほとんど変わらないということだと思います。
私は、iCanvasのライブラリで、この両方のメソッドを使用して色を扱っています。

union argb {
   uint clr;
   uchar c[4];
};


そういえば、私もパフォーマンステストをしたことがあるのですが、ほとんど差がないという結論になりました。しかし、unionを使ったコードの方が読みやすい。
ユニオンで顕著な性能向上を期待していただけに、正直言ってがっかりしています。

 
Nikolai Semko:

あらかじめ用意された配列に乱数を入れると最適化に走るというのは理解できない。

上記のhubrに2つのリンクがありますが、最初の記事は、コンパイル後の通常のループがどのように見えるかをよく表しています。

必ずしも実行時最適化にたどり着かなければならないとは言いませんが、イマイチ、配列が変化しない、つまり本来ループのサイズが一定のメモリ空間であれば、ある種のプロセッサでは最適化が飛び出さないということはなく、コンパイラからも、キャッシュを持つプロセッサからも最適化が期待できるのではと思います


ニコライ・セムコ

要は、ユニオンとバイナリシフト、どちらを使ってもほとんど変わらないということだと思います。

そうです、シフトを使います。コードは読みやすく、新しいデータ型 であるユニオンを導入する必要はありません。
 
Igor Makanu:

hbrの2つのリンクを紹介しましたが、最初の記事は、コンパイル後の通常のループがどのように見えるかをよく表しています。

実行時の最適化に手を出さなければならないとは言いませんが、イマイチ、配列が変化しない場合、つまり、基本的にループのサイズが一定のメモリ空間である場合、最適化が飛び出さないとは言い切れないのです

結果から判断すると、最適化の兆しはない

 
Nikolai Semko:

結果は、最適化されている印象を全く受けない

議論は、特定のコードについてではありません

しかし、テストの方法論では、私はまだ私が最適にテストするものに固執し、rand()は歪みを導入するが、比例ではなく、線形係数である、すなわち、5%未満の速度差がない場合は、精度はあまり重要ではありません、イミホ

 
親愛なる皆様、私が理解できないこの状況について、せめてどなたかお答えいただけないでしょうか。
 

みなさん、こんにちは。

MQL5の開発者に質問があります。 誰か知っているかもしれませんが...。MEコンパイラ/コードエディタと、IDEAやVisual Studioの ような一般的な開発環境との統合は予定されていますか?Meta Editorは私にとって大きな痛手です。ブロックの折りたたみ、自動置換テンプレート(例えば、for(...)をタイプし始めると、ループパターンやその他多くのものを置換するよう即座に提案してくれる)、コードの様々な重要部分の強調表示もありません。などなど。現代のロボットが複雑だと言っているのではなく、これらは大規模なプロジェクトであり、コード管理やチーム開発能力に対する要求はもっとシビアです。

エディターやコンパイラーを自作する人はいなくなり、みんなそれを手放してマイクロソフトやジェットブレインズなどの既成のソリューションに移行しています。最近のエディタには、カスタマイズ可能なプラグインのシステムがあり、好きなものを追加することができます。 この作業は原理的に難しくありません。

 
Сергей Таболин:
親愛なる皆様、このよくわからない状況に対して、どなたかお答えいただける方はいらっしゃいませんか?

さらにプログラマーをいじめろそうすれば、必ず助けてもらえるはずです。