キャンバスとラベルの比較 - ページ 13

 
Nikolai Semko:

あ、じゃあ全然普通なんですね。
また、私のgifにはキャンバスが1つありますが、頻繁に再描画する必要がなく、新しいバーが入る瞬間をキャッチできるため、最もリソースを消費しないパネルです。

素晴らしい全ては飛んでいる!

また、低速域ではスキップすることなく更新されます。
 
Dmitry Fedoseev:
正しいファイルが見つかりました。どこの、どのタイミングで数字を見ればいいのかは不明ですが、それを抜きにしても、キャンバスの速度が格段に上がっていることがわかりますし、1レブルではなく1キャンバス、ラベルの束ではなく、1キャンバスになっています。

エキスパートCanvasVsLabels.mq5を実行し、表示タイプoutTypeを 選択、limit_fpsを 有効化、nIterationsを 設定、デフォルトでは10000です。これで十分ですので、変更する必要はありません。そうすると、今回紹介したのと同じような結果になります https://www.mql5.com/ru/forum/364640/page11#comment_21301589。

Min delay,Mid delay,Max delayは それぞれ1回の実行における最小 遅延、平均遅延、 最大 遅延です。Total, は、nIterations パスの総数に対する合計時間です。

改めて、比較結果を 表にしてみました。

キャンバス無制限fps キャンバス限定fps ラベル 無制限fps レーベル限定fps
最小遅延時間 (μs) 1530 1 18 0
中間遅延時間 (μs) 7674 4086 48 7
最大遅延時間(μs) 11967 11093 785 286
合計(μs) 77727510 29452299 39648984 27439654


テスターでも全く同じ測定ができるように設計されています。でも、まだやっていないんです。暇な時にでもやってみます。今後、多くのBitmabLabelsを表示する実験をしていく予定です。

 

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

キャンバスとラベルの比較

fxsaber, 2021.03.13 19:26

こんな結果になってしまったのは私だけ?

fxsaber:

15~20%奪います。どうやら私のビデオカードは遅すぎるようです。

ResourceReadImageは非常に遅いことが判明しました。負荷がゼロになった。

 

もう一度、比較表を掲載しますが、今回はヒストグラムを掲載します。

キャンバス無制限fps キャンバス限定fps ラベル 無制限fps レーベル限定fps
最小遅延時間 (μs) 1530 1 18 0
中間遅延時間 (μs) 7674 4086 48 7
最大遅延時間(μs) 11967 11093 785 286
合計(μs) 77727510 29452299 39648984 27439654


パスごとの平均遅延値の比較

中間遅延

なぜか総走行時間(Total)とは比較にならないが...。

総実行時間の比較

合計

計測の結果、FPSに制限のあるCanvasベースの表示(Canvas unlimited FPS)は、FPSに制限のある Labelsベースの表示(Labels unlimited FPS)よりも若干遅くなることがわかりました。しかし、一般的には、どちらも負荷の高いプロセスの情報を表示するのに適している。

Expert Advisor を実行して計測を行う方法

入力パラメータ

  1. キャンバスまたはラベルのドロップダウンリストから、outTypeを 選択します。
  2. limit_fps のオン/オフを設定します。
  3. 選択内容を確認する
  4. Start ボタンを押すと、チャートの計測を開始します

測定開始

同様に、Expert Advisorでもビジュアルテスターで計測することができます。ただし、入力パラメータnIterationsの 値と少なくとも同じ数のバーが履歴に残るように、テスターの設定で日付範囲を設定する必要があります。

詳細な情報およびソースは、Chart Display libraryの説明で見ることができます: https://www.mql5.com/ru/code/33898

測定用に特別に改良されたライブラリhttps://www.mql5.com/ru/code/download/33898/chartdisplay.mqh

測定のユニバーサルエキスパート: https://www.mql5.com/ru/code/download/33898/canvasvslabels.mq5

詳しくはKB: https://www.mql5.com/ru/code/33898 をご覧ください。


このスレッドの最初の投稿で、新しいExpert Advisorで行った正しい測定結果を追加したいと思います。今ある測定値が正しくないので。しかし、最初のメッセージは、残念ながら、もう編集することができません。モデレーターの方々には、もっと正しい測定 値を冒頭に追加していただき、今あるものは無関係とマークしていただくようお願い します。

Дисплей с оптимизацией для вывода текста в чарт по типу консоли
Дисплей с оптимизацией для вывода текста в чарт по типу консоли
  • www.mql5.com
Данная библиотека позволяет создавать дисплеи для удобного вывода текстовой информации в чарт с наиболее оптимальной скоростью
 
fxsaber:

ResourceReadImageは非常に遅いことが判明しました。処分した - 負荷ゼロ

マジで?
自分へのサプライズ
同じサイズの普通のuint配列をコピーするのと比べて、どのくらい遅くなるのでしょうか?
 
Mihail Matkovskij:

実行中のエキスパートCanvasVsLabels.mq5...

何が言いたいの?今はコードを掘り下げたくないんです。これらの数値はどのように算出されているのでしょうか?テスターでテストする場合、実行に費やされた総時間を測定し、それ以外のことは測定しないようにすべきですが、個々のコードフラグメントのパフォーマンスは測定しません。極端な話、イナイレはカウントしないでください。そしてなんと、計測をしなくても、kanvasの方が遅いことがわかるのです。何か異常があるのでは...?

 
Nikolai Semko:
そうなんですか?
自分へのサプライズ
同じサイズの普通のuint配列をコピーするのと比べて、どのくらい遅くなるのでしょうか?

通話ありの場合は15%程度の負荷、通話なしの場合はゼロでした。

 
Dmitry Fedoseev:

何が言いたいの?今はコードを掘り下げたくないんです。この数値はどのように算出されているのでしょうか?そのようにテスターでテストする場合、実行に費やした総時間とそれ以外を測定すべきであり、別々のコードフラグメントのパフォーマンスを測定すべきではありません。極端な話、イナイレはカウントしないでください。そして、ここでは計測しなくても、kanvasの方が遅いことがわかります。何か異常があるのでは...?

コードを掘り下げるのは嫌だ。私も鵜呑みにはしたくありません。:)どう説明したらいいのかわからない。私がどのようにコードを書いたか、最初から最後までお話しします...。一本の記事になりますよ。:)

それに、専門家がどうやって測定しているのか、まったく理解できない。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void run() {
  MqlRates rates[];
  int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
  ulong start, min, mid, max;
  ulong last, delay; 
  static ulong totalDelays = 0;
  static int nTick = 0;
  ulong first;
  if (!triggerBtn.State())
    return;
  start = GetMicrosecondCount();
  min = INT_MAX; mid = 0; max = 0;
  if (CopyRates(NULL, PERIOD_CURRENT, 0, nIterations, rates) != nIterations) {
    triggerBtn.State(false);
    triggerBtn.setText("Start");
    Print("Not enough quotes!");
    Comment("Not enough quotes!");
    return;
  }
  for (int i = nIterations - 1; i >= 0 && triggerBtn.State(); i--) {
    first = GetMicrosecondCount();
    
    display.push();
    display.setText(concatenate(i));
    display.update();
    
    last = GetMicrosecondCount();
    delay = last - first;
    if (delay < min)
      min = delay;
    if (delay > max)
      max = delay;
    nTick++;
    totalDelays += delay;
    mid = totalDelays / nTick;
    Comment("Min delay: " + (string)min + " μs\n"
            "Mid delay: " + (string)mid + " μs\n"
            "Max delay: " + (string)max + " μs\n"
            "Total: " + (string)(GetMicrosecondCount() - start) + " μs" + " \n"
            "Completed: " + (string)(int)(100.0 / nIterations * (nIterations - i)) + "%");
  }
  
  printf("Min delay: %d μs", min);
  printf("Mid delay: %d μs", mid);
  printf("Max delay: %d μs", max);
  printf("Total: %d μs", GetMicrosecondCount() - start);
  triggerBtn.State(false);
  triggerBtn.setText("Start");
  ChartRedraw();
}
Totalはループの最後で、min, mid, maxはループの本体で、display.push, display.setText, display.updateの後に計算されます。何も難しいことはなく、腰を据えてすべてをじっくり見れば、少なくともKanvasとLabelsのソースコードにはたどり着けるはずです。ちなみに、そこも複雑なことは何もないんですよ。Kanvasのベジェ曲線などを 描画するメソッドは除く。
 
Dmitry Fedoseev:

そして、ここでは計測を行わずに、カンヴァスの方が遅いということがわかります。何か異常があるのでは...?

どのような入力パラメータでKanvasが遅くなるのか、教えてください。limit_fps: falseなら当然ですが...。:)

 
fxsaber:

ResourceReadImageは非常に遅いことが判明しました。処分して負荷ゼロに。

コンパイル時に保存したリソースから読み出す場合は、1回で済みます。

リソースはコンパイル時に圧縮されます。