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

 

フォローアップとして


1,2,3のどの行がまだ資源を消費しているのでしょうか?

プログラム全体の時間の55%を占める「重い」iTimeが、0.81%のSelf CPUしか表示されないのは理解できないのですが?
またその逆も然りで、なぜ開き括弧(1)と最も単純な条件(2、ごく稀に真になる)が33.84%のSelf CPUを表示しているのでしょうか?

Self CPUとTotal CPUが一致しないのはなぜですか?


この機能は本当に重いのですが、その重さはすべてコードのさらに下に位置しています。そして、プロファイラがiTimeと2つのブール変数に代わるものを探すよう指示するのです!?

明らかに理解できないことがある。

 
Andrey Khatimlianskii:

明らかに何かが足りない。

滑っているのでは?

 
Andrei Trukhanovich:

滑っているのでは?

そうは見えない、レポートの数値は同じだ。

 
Andrey Khatimlianskii:

イリヤス、この件も解決してくれ。

1.なぜ空の関数呼び出しがセルフのCPUの34.5%を消費することがあるのか?同時に、それに続く関数の呼び出しは、その内部で総CPUの38.16%を占めていますが、レポートには全く表示されないのですね。


ファンクションコードです。



2.この例では、TimeCurrent()の行が関数内だけでなく、プログラム全般で不当に長い時間をかけていることが2つ目の問題点として示されています。

CheckTimeSeries()の本体をコメントアウトする前は、そのTimeCurrent()の行に主な負荷がかかっていたのです。

そんなに重い機能なんですか?何に置き換えたらいいのか?あるいは、経済的な方法(プログラム実行の1ループ内でのキャッシング)は?

できる限り、計算を間引いて保存しています(1小節に1回、X秒に1回、Yミリ秒に1回、など)。しかし、計算を行うかどうかのチェック自体が、かなりリソースを消費することが判明しました。


ありがとうございました。

1) コードがないと、なぜこの統計が悪いのか言いにくいのですが、たぶん最適化が原因でしょう。

2) ループの前に Timer 関数で時刻を取得 し、それをパラメータとして渡すようにしたらどうでしょう。

 
Andrey Khatimlianskii:

フォローアップとして


1,2,3のどの行がまだ資源を消費しているのでしょうか?

プログラム全体の時間の55%を占める「重い」iTimeが、0.81%のSelf CPUしか表示されないのは理解できないのですが?
またその逆も然りで、なぜ開き括弧(1)と最も単純な条件(2、ごく稀に真になる)が33.84%のSelf CPUを表示しているのでしょうか?

Self CPUとTotal CPUが一致しないのはなぜですか?


この機能は本当に重いのですが、その重さはすべてコードのさらに下に位置しています。そして、プロファイラがiTimeと2つのブール変数に代わるものを探すよう指示するのです!?

明らかに理解できないことがある。

1) 関数がインライン化されていると仮定します

2) カウンタは本当に無関係です、SelfCPUは関数コードの負荷で、呼び出された関数を考慮に入れていません、与えられたコードでは、IFオープナー(ブランチング)になっています

3)TotalCPUカウンタは、プログラムのこのブランチ内のすべての呼び出しのために、実行ブランチの負荷を示しています

 

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

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

 
Ilyas :

1) 関数がインライン化されていると仮定します

2) カウンタは本当に関係ありません、SelfCPUは関数コードの負荷です、呼ばれた関数を考慮せずに、上記のコードでは、IFオープナー(ブランチング)です

3)TotalCPUカウンターは、プログラムのこのブランチでのすべての呼び出しに対して、実行のブランチの負荷を示します。

どのように役立つのですか?明らかに、IF文単体ではCPU負荷が低い。ファンクションコールを含めるべきではないか?

いずれにせよ理解する方法(アンドリューの例から)。

if(!simulated) taking 3.86% ?!?

これはどうなんだろう?


同じTick()関数にいるようなところ!

本当にProfilerを使って理解したいのですが、どれも意味がわかりません。すみません。

どうすればいいの?どうすればいいのでしょうか?

 
Ilyas:

1) コードがないと、なぜ統計値が高いのかがわからない。おそらく最適化が原因だろう

2) ループの前に Timer 関数で時間を取得 し、さらにそれをパラメータとして渡すようにしたらどうでしょう。

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

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

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

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

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


イリヤス

1) 関数がインラインだったと仮定します

2) カウンタは本当に関係ありません。SelfCPUは関数コードの負荷で、呼び出された関数を考慮していません。上のコードでは、IFオープナー(分岐)になっています。

3)TotalCPUカウンタは、プログラムのこのブランチ内のすべてのコールのために、実行の分岐の負荷を示しています

1)なぜこのような貪欲な開口部の括りがあるのか、理解に苦しむ。これをどう解釈するか。

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

これは、iTimeを使った文字列のSelfCPUが低いことも説明しています。ごくまれにしか到達せず、ほとんど呼び出されなかっただけなのです。

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

 
Andrey Khatimlianskii:

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

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

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

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

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


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

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

これは、iTimeを使った文字列のSelfCPUが低いことも説明しています。ごくまれにしか到達せず、ほとんど呼び出されなかっただけなのです。

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

標準配信の中から任意のコードを取り出して校正し、それを元に質問してください。これにより、再現性のある状況判断が可能となり、正確な回答が得られます。

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


参考:100人中1人のC++プログラマーがプロファイラーを使い、そのレポートを理解できることを神は禁じている。ネイティブコードのオプティマイザのせいだ。

 
Alain Verleyen:

いずれにせよ理解する方法(アンドリューの例から)。

if(!simulated) taking 3.86% ?!?

そうですね、外部関数 呼び出しを考慮しないと、SelfCPUはあまり情報量が多くありません。MQLのネイティブ関数が使用される最下層でのみ、本当の負荷がわかります。
しかし、この場合、これらの関数がどの場所からより頻繁に呼び出され(より多く消費され)、どの場所から単一の呼び出しがあるかが明らかにならないのですさて、CopyXXXとOrderXXXの関数が最も時間を消費していることを知ったところで、何の意味があるのでしょうか?私のプログラムのどのチャンクから、それらが頻繁に、あるいは不十分な形で呼び出されているのかを知る必要があります。

TotalCPUと合わせて、 モードがそうなんでしょうね。調べてみますね。しかし、今のところ、完全にコメントアウトされた行までありますね(!)。