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

 
Artyom Trishkin:

fxsaberよりご挨拶申し上げます。

このコードで何ができるのか、イメージを教えてください。

 

ArrayResizeがリザーブタスクで 非常に遅くなる理由を教えてください。

スクリプト

// Добавление элемента в конец произвольного массива
template <typename T>
void AddElement( T &Array[], const T &Value, const int Reserve = 0 )
{
  const int Size = ::ArraySize(Array);

  ::ArrayResize(Array, Size + 1, Reserve);

  Array[Size] = Value;
}


#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

int Bench( const int Size, const int Reserve )
{
  const MqlTick NullTick = {0};
  MqlTick Ticks[];  
  
  for (int i = 0; i < Size; i++)
    AddElement(Ticks, NullTick, Reserve);
    
  return(ArraySize(Ticks));
}

void OnStart()
{
  BENCH(Bench(1 e7, 1 e5)); // 100 раз выделяется память
  BENCH(Bench(1 e7, 1 e6)); //  10 раз выделяется память
  BENCH(Bench(1 e7, 1 e7)); //   1 раз выделяется память
}


結果

Time[Bench(1 e7,1 e5)] = 38199494
Time[Bench(1 e7,1 e6)] = 3867983
Time[Bench(1 e7,1 e7)] = 479303


100回のメモリ割り当て(5Mbから500Mbまで)に38秒かかる。正常なのでしょうか?

実用的なのは、カスタムキャラクターで、インポート前にティック履歴を用意したい場合です。ローカルストレージにティックデータのCSVファイルがいくつかあり、それらをMqlTick-arrayにする必要があるとする。最適な方法で行うには?これらのファイルの刻み量を事前に計算することは不可能である。

 
Rashid Umarov:

このコードで何ができるのか、イメージを教えてください。

 
fxsaber:

これらのファイルの刻み数をあらかじめ計算することはできません。

ファイルサイズを 1刻みの目安で割ると?

 
Andrey Khatimlianskii:

ファイルサイズを1刻みの目安で割ると?

残念ながら、ファイルサイズは わかりません。ZIPからCSVを解凍しています。

 
Rashid Umarov:

画像を見ることができます - 何をするものですか?

選択した期間のスクリーンショットを作成することは困難であることが判明しました - たぶん、2つの日付範囲を含むバーをキャプチャするための適切な幅の定義ソリューションがあるのでしょうか?

 
Aleksey Vyazmikin:

選択した期間のスクリーンショットを作成することは困難であることが判明しました。2つの日付範囲を含むバーをキャプチャするための適切な幅定義の解決策はありますか?

難易度は?1つのスクリプトでスケールの違う2つのスクリーンショットを作り、スクリーンショットに指定した日付から30本のバーを表示するようにしました。


 
fxsaber:

残念ながら、ファイルサイズはわかりません。ZIPからCSVを解凍しています。

ZIPからどこへ行くのか?アレイに?文字列に?サイズ・長さもあるそうです。

 
Alexey Viktorov:

苦労した点は?このスクリプトは、指定された日付から30本のバーが表示されるように、スケールを変えて2枚のスクリーンショットを作成したものです。


ズームをゼロにします。それでも、2枚目のスクリーンショットでは、1枚目と違って、バーがすでに締まっているのがわかりますね。

そして、30本とは、600本にしよう!ということです。
 
Andrey Khatimlianskii:

ZIPからどこへ行くのか?アレイに?文字列に?サイズ・長さもあるそうです。

そうすると、すべてを解凍して、何百メガバイトもの解凍したものをメモリ上に残しておかなければならなくなるのです。

または、文字列の数(文字列-刻み)を合計して解凍する。メモリに保存します。そして、再び解凍するのですが、パースがかかっている状態です。