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

 

なんだこれは!?


 
fxsaber #:

プロファイラには、実際には発生していない関数呼び出しが表示されます。こんなものまで出てきました。

mqh-fileの ソースにはない、ある種のArrayCopy!静的配列の宣言に赤線を引いたくらいです。

やはりプロファイラーが使えないのは残念です。

そして、オブジェクトの構築、代入、移動の際に、どのように、どのような配列が動くのかを考える(そして、オブジェクトを持つことになる)。

プログラムはあなたの文字列だけで構成されていると本当に思っているのですか?

例題は完全ではありません。

 
Renat Fatkhullin #:

そして、オブジェクトの構築、代入、移動の際に、どのように、どのような方法で配列が移動されるかを考える(そして、オブジェクトを持つ)。

本当にあなたの文字列だけでプログラムが成り立っていると思っているのですか?

例題は完全ではありません。

このテーマを先送りせずに取り組んでもらうために、私のほうで何をすればいいのか、明確に指示してください。

 
fxsaber #:

このテーマを先送りせずに取り組んでもらうために、私のほうで何をすればいいのか、明確な指示を出してください。

あなたは、自分が理解していない話題(コンパイラとその内部)に対して発言している。

インストラクションは役に立ちません。オブジェクト言語における暗黙的に生成されるコードの 広大な世界を理解するために、コンパイラ開発者のコースを受講しているわけではないのですから。高水準言語では、ライブラリやインラインコードを多用します。WinAPIで平均的なプロジェクトを組み、*.mapファイルを見てください。そこには何千もの補助関数があり、そのどれもがプロファイリングに現れる可能性があります。

私が何十回も繰り返した「出来上がったコードはあなたのコードとは関係なく、最適化コンパイラによって最適化され、埋め込まれ、シャッフルされる」という言葉も耳に入ってこないのです。コンパイラの主な仕事は、コードをできるだけ速くすることであって、読みやすくすることではありません。プロファイラの仕事は、最適化された(実)コードの本当のボトルネックを示すことであり、行のマッチングでごまかすことではありません。

比較対象として、現時点でのC++コードのプロファイリングは、オプティマイザが素晴らしいマッチフィクサーであるため、しばしば非常に困難な作業となります。そして、はい、Microsoft Visual Studio C++はベンチマークではなく、それが生成するコードは非常に弱い/悪いです。LLVM/Clangの競合製品と比較すると、20〜30%程度劣っている。


今回もまた、調査対象のコードを変更しないプロファイラを用意しました。チェック時間は増えますが、カウンターを埋め込むことでコードの最適化が死んでしまうようなことはあまりありません。

プロファイリングに用いられる手法は「サンプリング」です。プロファイラーはMQLプログラムを一時停止し(1秒間に約1000回)、特定のコード断片で何回一時停止が発生したかを統計的に収集します。これには、コードの総実行時間に対する各関数の「貢献度」を判断するためのコールスタックの分析も含まれます。プロファイリングの最後には、各関数が何回ポーズされたか、各関数が何回コールスタックに 載ったかを取得します。

  • CPU総活躍度[単位、%] - 関数がコールスタックに「出現」した回数の合計。
  • 独自のCPUアクティビティ[単位、%] - 指定された機能内で直接発生した「一時停止」の数です。このカウンターはボトルネックを特定するために最も重要である。なぜなら、統計的に、より多くのCPU時間を必要とするプログラムの部分で停止がより頻繁に発生するからである。



ワンステップで再現できる例がなければ、問題を検討することはありません。マイクロタスクの数回の呼び出しによる単純化された合成は、かかった時間の割合や総時間への貢献度という観点からも考慮することはできない。

 
Renat Fatkhullin #:

あなたは、自分が理解していない話題(コンパイラとその内部)について発言しているのです。

あなたが特定した話題について全く無知である。プロファイラには、どのようにでも解釈できるデータが表示されます。

今回もまた、調査対象のコードにほとんど遅延を発生させないプロファイラを用意しました。チェック時間は増えますが、カウンターを埋め込むことでコードが台無しになることはありません - それはコードの最適化を殺すことになります。

新しいプロファイラーでボトルネックを確認しようとしています。一生懸命やっているのですが、うまくいきません。

ワンステップで再現できる事例がなければ、問題には目を向けません。マイクロタスクの数回の呼び出しによる簡略化された合成は、かかった時間の割合や総時間への貢献度という観点からも考慮することはできません。

リプレイ用のデータはどこに送ればいいのか?LSのデータを見ると、LSのメッセージは長い間読まれない可能性があります。

緑のチェックマークが2つ付いているものは既読、1つ付いているものは未読を示します。

 
fxsaber #:

あなたが特定した対象について全く無知である。プロファイラーには、どうにも解釈できないデータが表示される。

新しいプロファイラーでボトルネックを確認しようとしています。努力はしているのですが、うまくいきません。

リプレイ用のデータはどこに送ればいいのか?PMのデータから、PMメッセージが長い間読まれない可能性があることがわかります。

緑のチェックマークが2つあればメッセージは既読、1つあれば未読です。

同じように、ハンマーは一箇所でも多く叩けば叩くほど、その機能は高くなります。

チープな変数にカウンターが当たる確率は?

カウンタがヒットすることがすぐに理解できる関数がありますが、それらはスキップされます。

 
Fast235 #:

一事が万事、ハンマーが当たれば当たるほど、その機能はコスト高になる

チープな変数にカウンターが当たる確率は?

カウンタがヒットすることがすぐに理解できる関数がありますが、それらはスキップされます。

一見してわかる美しい理論ではなく、実践的な応用の話をしているのです。

 
fxsaber #:

最初に理解しやすい美しい理論ではなく、実用的な応用の話をしているのです。

実用的なのは、昔は何回発動するんだ?

それは、純粋に完璧主義的な興味です。

余分な通話は、たとえ安くても見る必要があることに同意します。

 
Fast235 #:

実用的なのは以前と同じで、何度目というのでしょうか。

以前のプロファイラーではボトルネックを見つけることができましたが、ここでは、理論的には何度も研究されているにもかかわらず、データでは何が起こっているのかわからないという話になっています。

 
fxsaber #:

以前のプロファイラではボトルネックを見つけることができましたが、今回は新しいプロファイラの話です。理論的にはすべて何度も研究されていますが、そのデータでは何が起こっているのか理解できません。

Renatは新しいプロファイラーを一般的なフレーズで表示するのではなく、サブのような確信犯にもわかるようにすること)(けなしてるわけではありませんよ)。