MT5コードプロファイラについて - ページ 4

 
Renat Fatkhullin:

標準添付のコードから任意のコードを取り出し、プロファイリングして、それに基づいて質問してください。これにより、再現性のある状況判断が可能となり、正確な回答が得られます。

そうでなければ、プロファイラの レポートを担当するのは、あなたのコードの小さな断片では意味がありません。その背後には、膨大な量のオプティマイザーの作業があり、すべてのコードをまったく別のごちゃごちゃした埋め込み表現に変えてしまうのです。

再現性がなければ正確な回答は得られないと理解しています。

標準的なコードはプロファイリングされにくいが、再現性のあるチャンクをあげてみる。

 
Andrey Khatimlianskii:

ご回答ありがとうございました

1) 単純なコードでは再現できないと思うのですが、そうですか。それに、プロジェクトの全貌を明らかにするのはまだ早い。

2)この特別なケースでは、私は同意します。

しかし、同じまたは類似のチェックを使用する他の多くのクラスは、TimeCurrentまたはGetTickCountなしではやっていけないのです。
同じ値を何度も要求しないように呼び出しを最適化するには?

また、TimeCurrentは本当に重い計算のバックグラウンドで目立つほど重いのでしょうか(たとえ1分や5分ごとに実行されていたとしても)。
それとも、また勘違いして、Total CPUの38.16% / Self CPUの26.07%が、(TimeCurrent 関数コールを考慮しない)if自体のチェックに占拠されていたのでしょうか?しかし、ではなぜそうなのでしょうか。


1)なぜこのような貪欲な冒頭の括弧があるのか、理解に苦しみます。これをどう解釈するか。

2)SelfCPUについて、明確になりました、ありがとうございます。呼び出される機能を無視して、機能コードを読み込んでいるのです。

これは、iTimeを搭載した文字列のSelfCPUが低いことも説明しています - それは非常にめったに到達しなかった、それはちょうどめったに呼び出されませんでした。

しかし、なぜTotalCPUが高いのでしょうか?それとも、プログラム全体のすべてのiTime(と他のCopyXXX関数?)関数のロードを表示するのでしょうか?

  1. ブレイクアウェイブラケット - 通常、関数のプロローグとして、いくつかの命令を配置し、特にローカル変数を初期 化するために使用すると考えてください。
    関数のローカル変数のサイズに注意を払う、あなたが呼ばれるのインライン化のためにサイズが増加することができることを考慮する必要があります
    . 関数は、ローカル用の4Kb以上を消費した場合、サービス関数は、スタックメモリを提供するために呼び出されます - これは厳しい真実Nativaです、それを取り除くことはできません。

  2. SelfCPUは呼び出しをカウントしてはいけません。そうしないと、単にTotalCPUが重複し、自身の命令の時間が呼び出された関数の時間で希釈されてしまいます。
    文字列に対するTotalCPUはその文字列の「時間」だけです。
 
Alain Verleyen:

常に100%であるべきではないでしょうか?あるいは、@global_initializations と @global_deinitializations も考慮すると、若干少なくなります。

102%以上です...(過去データで3003を構築)。

古いプロファイラの場合、より多くなる可能性があると記事に ありました。

プロファイリングは、各関数が何回呼び出されたか、実行にかかった時間など、重要な統計情報を提供してくれます。割合の統計に少し戸惑うかもしれません。ここで理解すべきは、統計は関数の入れ子を考慮しないので、すべてのパーセンテージの合計は100%よりはるかに大きくなることである。

 
Vasiliy Pushkaryov :

旧プロファイラーについて、記事では 「もっとあるのでは」と指摘されています。

ありがとうございます。しかし、私が理解する限りでは、新しいプロファイラーでは異なるはずです。言い訳は許されない、エラーはエラーだ。
 
Ilyas:
  1. ティアオフブラケット - 関数のプロローグと考えてください。通常、配置と特にローカル変数の初期 化にいくつかの命令を必要とします。
    関数のローカル変数のボリュームに注意してください、あなたが呼ばれるのインライン化のためにボリュームが増加する可能性があることを考慮する必要があります
    関数がローカルに4Kb以上を消費する場合、サービス関数がスタックメモリを提供するために呼び出されます - これはnativaの厳しい真実であり、それを取り除くことはできません。

  2. SelfCPUは呼び出しをカウントしてはいけません。そうしないと、単にTotalCPUを重複させ、自身の命令の時間が呼び出された関数の時間によってぼやけます。
    文字列に対するTotalCPUはその文字列の「時間」だけです。

1) 関数本体で宣言されている double 変数は 1 つだけです(const bool シミュレートされた関数パラメータはカウントされません)。

2) 11個ある作業ツールのうち1個(「m_CloseOnFirstTickOnly || m_OpenOnFirstTickOnly」条件が発生したもの)のiTime( m_symbol, PERIOD_CURRENT, 0 )をプロセッサが受信したということですね。

それとも、"Functions by Calls "モード(表示しませんでしたが)のことでしょうか?


私は、本質的な話をするために、理解できない結果で再現可能なコードのスニペットを作るようにします。

 

プロファイラのデータの解釈を簡単な例で教えてください。

#include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

const bool Init = EventSetMillisecondTimer(1);

void f()
{
  Sleep(1);
}

void OnTimer()
{
  _USAGE
  
  f();
  Sleep(2);
}


ナンセンスにしか見えません。

  • Sleep(2)が完全に欠落しています。
  • なぜかUSAGEはSleep(1)の数倍も食っている。


本当にコツを掴もうとしているのですが、まだうまくいきません。


また、Sleepの交換も試しました。

void Sleep2( uint Interval )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Interval *= 1000;
  
  while (GetMicrosecondCount() - StartTime < Interval)
    ;
}

#define Sleep Sleep2

まだプロファイラの値が明確でない。

 
fxsaber #:

プロファイラのデータの解釈を簡単な例で教えてください。


ナンセンスにしか見えません。

  • Sleep(2)が完全に欠落しています。
  • なぜかUSAGEはSleep(1)の数倍食っている。

この同じコードは、MT4で全く正しい結果を生成します。


MT5で何が間違っているのでしょうか?

ZZY MT4プロファイラを使用したMT5の最後のビルドはb2595です(b2593 - Internal compiler errorを生成する場合)。

 
また、自分が書いたコードと実際に実行可能なものがイコールだと思うのはなぜでしょうか?

最適化のし過ぎと、出来上がったコードのブレンドについて、何度説明したらわかるのでしょうか。接頭語はそのことを明確に示しています。

また、サンプリングプロファイラが統計情報を収集する時間がないような極小のコードでは、プロファイラを 使用する意味がないのです。

プロファイラは、残酷なまでに最適化されたコードの中から、統計的に有意なコストのかかる場所を効率的に探すものであり、ソースコードを一行ごとにガイドするものではありません。

なぜなら、あなたのコードは、実際に実行することとはほとんど関係がないからです。




 
Renat Fatkhullin プロファイラを 使用する意味がないのです。

プロファイラは、残酷なまでに最適化されたコードの中から、統計的に有意なコストのかかる場所を効率的に探すものであり、ソースコードを一行一行ガイドするものではありません。

なぜなら、あなたのコードは、実際に実行することとはほとんど関係がないからです。

ソースコードのサイズが大きい過激なEAでプロファイラの値を説明するのは無理があるので、このような簡単な例を書くことになりました。

上記で質問しました。Sleep(1)に当たるのに、Sleep(2)に当たらないのはどうしてでしょう。何も起動せず、何も見ず、ただ一気にレスを書いたのでしょう。

最適化を無効にすると、同じように無意味なものが生成されます。さらに、古いプロファイラーは、まだ新しいアプローチがなかったb2596ですでに眠っています。勉強に費やした時間...

 

スマートオプティマイザは、2つ並んだSleepを1つにまとめているのだと思い込んでいました。しかし、チェックの結果、そうでないことがわかりました。

#include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

const bool Init = EventSetMillisecondTimer(1);

void f()
{
  Sleep(1);
}

ulong Temp;

void OnTimer()
{
  _USAGE
  
  f();
  
  Temp += GetMicrosecondCount() - Temp;
  
  Sleep(2);
}

void OnDeinit( const int )
{
  Print(Temp);
}

Sleep(2)が表示されない。