MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下桁数を取得 - ページ 15

 
Igor Makanu:

ArrayCopy()がCysh memmove()と同じ方法で行われた場合。

ArrayCopy()の実行速度は、メモリの確保速度に依存すると思います。中間バッファのメモリがコピーできる状態であれば、ArrayCopy()は非常に速く実行されますが、メモリが確保されていない場合は、OSにメモリの確保を 要求するようになるでしょう。

大きなデータ量でArrayCopy()を1回呼び出し、交換用のバッファメモリを準備した後、小さなデータ量でArrayCopy()をループし、速度を測定することができます。

今回の例では、静的配列でコピーを実行していますが、一般的には、もちろん、ArrayCopyが単純なforよりも遅い場合は、面白いです。メモリを確保する必要がある場合は、どのような方法であっても、いずれにせよそれを行う必要があります。

 
Ilya Malev:

今回の例では、静的配列にコピーしていますが、一般的には、もちろん、ArrayCopyが単純なforよりも遅い場合は、面白いです。メモリを確保する必要があるのなら、いずれにせよやらなければならないことだ。

静的か動的かは関係なく、ArrayCopy()がどのように実装されているか分からないので、Cishの標準的な関数の「ラッパー」だと思っただけで、memmove()は通常追加のバッファを介して動作します...。まあ、例によって以前の書き方なので、どのコンパイラがどう動くかは分かりませんが

SZY: MQLでランタイムをテストする方法がわからないんです(( - 何度か試したし、ヘルプから例も取ったと思うのですが、結果はなんだかとても違っていて、必要に迫られてこの質問を無視しました - パフォーマンスのテストはしていません、通常はプロファイラで、何がどのように時間内に実行されているのかを見ます

 
Igor Makanu:

ただ、MQLで実行速度をテストする方法がわかりません(( - 何度か試して、ヘルプから例を取ったと思いますが、結果はなぜか全く違っていたので、この問題はあきらめました。私はパフォーマンステストをせず、通常はプロファイラを使って、 時間内にどのように、何が実行されるかを確認するためです

一番簡単な方法はこちらです。

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

以下は、私が使った最も簡単な方法です。


ありがとうございます、わかりました、明日テストします

 
Ilya Malev:

はい、この方がずっと 速く動作します(可能な限りArrayCopyで置き換え、その他は同じです)。

だから、テストもせずに最初に思いついたことを書いたってばよ))

このバリエーションは、私の ものと変わりません。測定値(10回試行したうちの最短時間)がそれを証明しています。

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

60 /4 = 15 要素のサイクルなので、サイクルを持つ variant の方が高速であることがわかるでしょう。

ファイル:
 
fxsaber:

このバリエーションは、私の ものと変わりません。

どうやらそうみたいですね、構造体の型と配列の型だけは任意です。

 
fxsaber:

60 /4 = 15 要素のループのため、ループバリアントが高速であることがわかります。

不思議なことに、同じMqlTicksと intでArrayCopyより速くなりました。

 
Ilya Malev:

不思議なことに、同じMqlTicksと intでArrayCopyより速くなりました。

MT5x64で動かしています。

イリヤ・マレフ

どうやらそうらしいが、構造体の型と配列の型は任意である。

より多くの人に参加してもらうために、あえて一般的なケースを避けました。


これまで

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

MT5x64で動作しています。

より多くの人が参加できるように、あえて一般的なケースを回避した。


これまでのところ

あなたのコードはすでに高速化しているのでしょう :)

ArrayCopyの 機能(source start, dest start, count)を向上させ、パラメータが正しいかどうかをチェックするために、そこに多くのサービスコードを追加しなければならない......。

一般的に、あなたは多くのクールな作品/ライブラリを持っているので、フォーラムで最適な解決策を尋ねたり議論したりするのは不思議なことです :)

 
Ilya Malev:

フォーラムで最適な解決策を尋ねたり、話し合ったりするのは不思議なものです :)

HistoryTicksのライブラリに必要です。ご参加ありがとうございました。