アプリケーションのパフォーマンスをデバッグする方法
アプリケーションパフォーマンスは、多くのビジネスにとって重要な問題となる可能性があります。結局のところ、サーバーホスティングコストは直接的に利益に影響を与えるため、実行するコードのデバッグのためにパフォーマンスプロファイリングツールを使用することは、最終的にコスト削減につながることがあります。
どのような問題に注意すべきか
"ボトルネック"とは、アプリの中で他の速いコードの動作を遅くしている遅い箇所のことで、まるで水のボトルのキャップや交通を妨げる狭い道路のようなものです。あなたが書くコードには、どこかにボトルネックが存在する可能性が高く、それが大きいか小さいかにかかわらず、パフォーマンスプロファイリングツールを使用して特定することができます。
すべてのプログラムは異なりますが、多くのアプリケーションは同じような問題に悩まされることがよくあります:
- 関数が呼び出される頻度が高すぎます(キャッシングやスケジューリングを使用すると呼び出し回数を減らすことができます)
- IOブロッキングコード、通常は同期ディスクアクセスですが、過剰なメモリ使用も含まれます。
- コストのかかるメソッドを使った大きなループ。
- 特にJITコンパイルされた言語では、長いスタートアップ時間。
- 特にガベージコレクターがあるランタイムにおいて、不要なメモリ割り当て。
- 並列化や非同期プログラミングから恩恵を受ける分野。
プロファイラーでコードを調べるときは、これらのいずれかに注意を払うようにしてください。アプリに深刻で明らかなボトleneckがなくても、改善の余地があるだけでアプリの動作が速く、効率的になります。ちょっとしたパーセントの速度向上が積み重なれば、時間が経つにつれて大きな改善になります。
アプリがサーバー上で実行されているコードではなく、全体のネットワーク内での位置によってボトルネックになっている可能性もあります。たとえば、遅いデータベースに接続するAPIアプリケーションがある場合、ウェブサーバーがどれだけ速くても、常に遅い結果を待つことになるため、意味がありません。パフォーマンスプロファイラーは、コード内の問題をデバッグするのには役立ちますが、全体のネットワークアーキテクチャには役立ちません。
プロファイリングはどのように機能しますか?
パフォーマンスプロファイリングツールは、いくつかの点でデバッグツールと異なります。デバッグツールは、ブレークポイントやインスペクションのように、開発におけるテストや問題解決のためにIDEによって使用されます。プロファイラーは通常、問題が何か分からないという前提のもとで動作し、問題を特定するためにコード全体をプロファイリングしたいと思っています。プロファイラーはアプリケーションにフックし、高精度のタイマーを使用して、どの関数が最も長い時間を要しているかを追跡します。しばらく実行した後、問題の原因を特定するのに十分なデータが得られるでしょう。
ほとんどのプロファイラーは、最も時間を消費する要素によってソートされたスタックでデータを提示します。ほとんどのプロファイラーで一般的なグラフはフレームグラフであり、プログラム全体の呼び出し履歴の直感的な内訳を示しています。
使用するツールや方法は、プロファイリングする言語やランタイム、また、本番環境でアプリケーションをプロファイリングする必要があるかどうかによって異なりますが、基本的な考え方は同じです。
各プロファイラーは実行中のコードとの統合が必要なため、アプリケーションが使用している言語のプロファイラーをダウンロードする必要があります。一部は他よりも使いやすく、特にC#やJavaのような、コンパイルされた言語よりもアプリケーションに注入しやすい言語においては、扱いやすいです。
多くのIDEには、標準のデバッグツールセットに加えて、プロファイリングツールが組み込まれていることがあり、それらを使用することもできます。たとえば、Visual Studioでは、さまざまなアプリのパフォーマンスやメモリ使用量をプロファイルできます。
- Java - JProfiler、IDEA/Eclipse/Netbeans IDE
- Python - cProfiler、Palanteer
- JavaScript - Chrome DevTools
- C# - dotTrace、Visual Studio IDE
- C、C++ - オービット
もし何が時間がかかっているかのアイデアがあるなら、常にストップウォッチタイマーライブラリを使用してベンチマークを実行することができます。
例えば、Benchmark.NETは異なる関数に対して非常に高い精度でテストを実行でき、さまざまなアルゴリズムを相互にベンチマークするために一般的に使用されます。また、シンプルなものを使用することもできます。
Stopwatch
ベンチマークしたいコードを囲む。
パフォーマンスプロファイラーの使用
このガイドでは、完全な機能を持ち、他のプロファイラーに見られるほとんどのツールを備えた .NET アプリケーション用のパフォーマンスプロファイラーである dotTrace の使い方を示します。C# コードのプロファイリングをしていない限り、別のアプリケーションを使用している可能性が高いですが、全体的なプロセスは似ているはずです。
アプリを開くと、実行中の.NETプロセスに接続したり、自分自身の実行構成を設定してdotTraceからアプリを起動したりすることができます。プロファイラーからアプリを起動することは、特に起動時間が遅い時のデバッグに役立ちます。
アプリを実行すると、データの収集が始まります。必要なだけ実行できますので、収集した期間の分析を開くには「スナップショットを取得して待機」を押してください。
一旦開くと、コールスタックやコールツリーの横に多くのグラフが表示され、恐らく読みづらいと感じるでしょう。もしスレッド、ロック、待機に関連する多くの情報が表示されているなら、それはおそらく「メインスレッド」にスコープを設定する必要があるからです。
プロファイラーはすべてのスレッドを検出しますが、これはしばしば長時間待機するバックグラウンドタスクに使用されます。これらはIOのブロッキング問題の証拠となることがありますが、プロファイラーが示すほど単純ではなく、スレッドが何をしているかによって実際にはもっと複雑です。
dotTraceには、左側の「サブシステム」フィルターを使用して、作業領域に基づいてコードをフィルタリングする機能もあります。システムコード、ネイティブコード、リフレクション、コレクション、文字列、LINQなどの他の遅延のある領域もすべて検索できます。
メインウィンドウにはフレームグラフがあります。これには、すべての呼び出し "All Calls "から始まるアプリケーション全体の内訳が表示され、各関数の実行にかかる時間が表示されます。一部は未解決であり、一部はここに表示するには小さすぎるものもありますが、このグラフは任意の関数にズームインして、その呼び出しスタックの詳細な内訳を表示できます。
パフォーマンスプロファイラーのもう一つの基本的な機能はコールツリーで、最もアクティブな関数のネストされた内訳を実行にかかる時間でソートして示します。ここでは、dotTraceはまた、特定の関数とその子供たちが占める全体の時間の割合を示すパーセンテージも表示します。
関数にかかるCPU時間は常に問題ではない、特にガーベジコレクターを持つC#のような言語では。dotTraceはメモリの使用状況やアロケーションも追跡し、GCに不必要な負担をかけているものを見つけるのに使用できます。







