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

 
Nikolai Semko:
とりあえず外出先で。自分で試すことができます。10、100、1000、10000...といった異なるサイズの構造体の配列でユニオンを使用することである。
これにより、ループが桁違いに短くなり、ArrayCopyの呼び出し 回数も桁違いに少なくなります。
これはmemcopyのバリアントに近いはずです。

このアイデアが活かされました。この場合

ソースコードで全てを見ることができます。
 
fxsaber:

このアイデアが活かされました。そうすることで

ソースブックで全て見ることができます。
ええ、調べましたよ。効果がないのが不思議。
 
Nikolai Semko:
はい、調べました。効果がないのが不思議。

ソースにサイズを制御する行がある

#define  CONVERT_AMOUNT 128

この値を変更し、結果を見ることができます。値が100より大きい場合、速度は上がりません。全部で同じ数の要素がコピーされるので、実は簡単に説明できる。また、コピー部分が小さいことに起因する速度低下も解消されます。

 
fxsaber:

すでに 最高性能にロック オンされているのではと思うのですが。

はい、そうですね。
試してみたところ、TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4と同じ結果になりました。

 
Andrey Khatimlianskii:

ソースコードがあるんだから、自分で測ればいいんだよ。

だから測ってください。私はそうではないと確信しているので、記事にも測定にも無駄な時間を費やす意味はないと思います。

 
fxsaber:

すでに 性能の限界にきているのでは?

正直なところ、よくここまでmemcpyに迫ったものだと思います。そんなはずはないのです。何かがおかしい。

 
fxsaber:

もう 最高性能にこだわっているようです。

あなたの大変な誤算がわかったような気がします。
あなたのBANCHは、最低50本の全く同じランを選択します。
しかし、コンパイラは大賢者で怠け者だ。同じ仕事を50回することはなく、コードを最適化することができます。そのため、少なくとも1回実行するごとにアレイを変更する必要があります。あるいは、50を1に置き換えて、テスト回数を増やしてもよい。そうすれば、結果はまったく違ったものになり、より客観的なものになるはずです。

2018.12.09 13:55:43.048 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9813963
2018.12.09 13:55:43.048 StructToArray__2        TicksToIntArray_thexpert
2018.12.09 13:55:43.296 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 247579
2018.12.09 13:55:43.296 StructToArray__2        IntArrayToTicks_thexpert
2018.12.09 13:55:43.544 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 247840
2018.12.09 13:55:43.634 StructToArray__2        true
2018.12.09 13:55:43.766 StructToArray__2        
2018.12.09 13:55:43.766 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:43.766 StructToArray__2        TicksToIntArray_fxsaber4
2018.12.09 13:55:44.118 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 351847
2018.12.09 13:55:44.118 StructToArray__2        IntArrayToTicks_fxsaber4
2018.12.09 13:55:44.452 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 334011
2018.12.09 13:55:44.548 StructToArray__2        true
2018.12.09 13:55:44.692 StructToArray__2        
2018.12.09 13:55:44.692 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:44.692 StructToArray__2        TicksToIntArray_semko
2018.12.09 13:55:45.037 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 344707
2018.12.09 13:55:45.037 StructToArray__2        IntArrayToTicks_semko
2018.12.09 13:55:45.373 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 336193
2018.12.09 13:55:45.462 StructToArray__2        true

memcpyとの差が40%であれば、より妥当なところでしょう。

配列を圧縮することで効果があるのかなと思います。刻み目の配列は10-12倍に圧縮することができます。ただ、これで結果的にリソースを介した送受信の時間が短縮されるかどうかが問題です。

ファイル:
 
Nikolai Semko:


あなたのBANCHは、絶対に同一の50本のランのうち最小のものを選択します。
しかし、コンパイラは大賢者で怠惰なのです。同じ仕事を50回するのではなく、コードを最適化するのです。

コードは、やるべきことを正確に実行するように書かれています。コンパイラはmemcpyの 速度に影響を与えることはできませんが、パスの結果は以下のようになります。

1パスのループ

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 235285
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 192509
true


50点満点中

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 80970
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 81103
true
 
fxsaber:

このコードは、あなたがやりたいことをそのまま実現するように書かれています。コンパイラはmemcpyの速度に影響を与えることはできないが、パスの結果は

1パスのループ


50点満点中

しかし、では、なぜこのようなことが起こるのでしょうか。もちろん、コンパイラはmemcpyの 実行過程に影響を与えることはできないが、ループ中に計算されたパラメータがどれも変化しないことを理解すれば、最初の計算であらかじめ格納された結果を引き出して、実行を拒否することができる。プログラムのアロゴリズムを修正するために、私自身はこのようにコンパイラを構成しています。
 
Ilya Malev:

だから測ってください。私はそうではないと確信しているので、記事にも測定にも無駄な時間を費やす意味はないと思います。

その必要はない