プロファイリングとロギングの違いは何ですか?
プロファイリングをパフォーマンス測定に使用して、各機能にかかる時間を確認するだけですか? それとも私はオフですか?
通常、プロファイリング ライブラリはどのように使用されますか?
プロファイリングによって取得される統計の種類は何ですか?
ロギングは何が起こったかを教えてくれます。フォレンジックやデバッグに最適です。
プロファイリングはそれを定量化します。各領域でコードが費やした時間、またはコード本体が実行された回数を示します。コードのパフォーマンスを向上させるのに役立ちます。
プロファイリングは通常、コード行、関数呼び出し、場合によってはファイルのレベルで動作します。各レベルについて、通常は次のことがわかります。
ユニットが実行された回数。通常、ほとんど使用されないコードを最適化することは、何百万回も実行されるコードほど重要ではありません。1 つの例外は、ユーザー (または別のプロセス) が完了するまで待機させるコードです。
orステートメントなどで、分岐が行われた回数。繰り返しになりますが、通常、頻繁に使用されるコードの最適化に最も関心があります。if
switch
特定の機能に費やされた時間。 警告:経験豊富な開発者でさえ、これらの結果に驚かされることがよくあります。「時間の無駄」がどこにあるかを予測することは非常に困難です。
関数とその関数内で呼び出されたすべての関数で費やされた時間。おそらく、最適化が必要なのは関数自体ではなく、その子です。
各呼び出し元によってユニットが呼び出された回数。特定の関数が主に予期しない場所から呼び出されていることに気付く場合があります。
優れたプロファイラーからのデータを利用すると、比較的少ない労力でパフォーマンスを大幅に改善できることがよくあります。
プロファイリングとは、関数/メソッド呼び出しに関するパフォーマンスを決定することです。たとえば、
プロファイリングの全体的な考え方は、システムの全体像を把握して、どこで最適化を行うことができるかを判断することです。特定の関数が 2 番目に頻繁に呼び出される関数よりも 20 回多く呼び出されていることがわかっている場合は、最適化の努力をいつ集中すべきかがわかります。
また、時間を費やすべきではない場所も示します。1 時間に 1 回しか呼び出されない関数の最適化に 1 日を費やしたくありません。1 秒間に複数回呼び出される関数の最適化に時間を集中したいと考えています。
Loggingは、私の理解では、呼び出されたものを追跡するだけです (ただし、各呼び出しに関連付けられた詳細なメタデータはありません)。
Rational Quantify などのプロファイリング ライブラリは、実行中にコードを計測して統計を収集することによって機能します。これは暗黙のパフォーマンスへの影響がありますが、システム全体で相対的なものです。
プロファイリングは、プログラムの実行時間効率を判断するために使用されます。メモリ使用量または CPU 使用量を測定するために使用できます。これを使用して、コードを最適化できます。
一方、ロギングは監査機能です。実行中にプログラムが何をしたかを確認したいとします。パフォーマンスよりもデバッグに使用されます。
ログには、stackoverflow に投稿した質問の数が表示されます。
プロファイリングは、各質問を投稿するのにかかる時間と、あなたがここで費やした勤務日の時間を示します。
私はプロファイリングをパフォーマンス測定と考えています。実行中のすべてのコードをプロファイリングする必要はありません。特定の領域をターゲットにしたほうがよい場合もあります。
ロギングとは、後で使用するために情報を保存することです。この情報は、プロファイリングに関連する可能性がありますが、必ずしもそうではありません。何が起こったかを記録するだけかもしれません。
私がこれまでに使用したすべてのプロファイリングは、基本的に「トランザクション」の開始時刻と終了時刻を保存し、後でデータを操作して、最も時間がかかっているものを確認することを可能にします。
ロギングとは、監査またはトラブルシューティングの目的で行われたことを記録することです。プロファイリングとは、パフォーマンスを測定する手法です。プロファイリングは、パフォーマンス メトリックをログに記録するか、専用のツールまたはユーティリティを使用して実行中のシステムの状態を調べることによって実行できます。
通常、ログ ステートメントはソース コード自体に記述されますが、プロファイリングでは、コンパイル後にコードを変更でき、その後プロファイリング セッションでのみ計測されます (つまり、ビルド自体のどのバージョンにもプロファイリング コードは存在しません)。パフォーマンスをリアルタイムで測定するか、サンプリングして、粒度は低くても邪魔にならない方法でパフォーマンスを追跡できます。
以前の答えは正しいです。
ただし、私見では、プロファイラーは銃よりも煙が多く、これによりいくつかの矢印がクリックされるに違いありません。
関数がどれくらいの時間を担当しているかを知りたい場合は、呼び出された回数と呼び出されたときにかかる時間の両方を知る必要があります。これらの一方が他方なしでは役に立たない。
これらの両方がわかったとしても、関数内のどのステートメントが時間を担当しているかはわかりません。それらは、注釈付きのコール グラフなど、多くのことを教えてくれますが、それでもなお、パズルを解かなければならない多くの手がかりの形をしているため、推測がより「情報に基づいた」ものに聞こえます。
次に、数値がいかに「正確」であるかについて話します。素晴らしいプレゼンテーションになりますが、問題は解決しません。
彼らができること (そしてできないこと) は、特定のステートメントまたは指示を指して言うことです。
ここにあるこの正確なステートメントを取り除くことができれば、合計実行時間の X% を節約できます。
それらをXでソートします。
パフォーマンスの問題を本当に修正する必要がある場合は、それが必要であり、自分で簡単に入手できます。こちらをご覧ください:
プログラムのパフォーマンスを最適化する方法