メソッド エントリのデバッグを使用すると、デバッグされたプログラムの速度が非常に遅くなるのはなぜですか?
質問
jdi インターフェイスを使用してデバッガーを作成していますが、MethodEntryRequests を使用してメソッド エントリのトレースを有効にすると、デバッグされたプログラムの速度が数十倍遅くなります。メインスレッドのフィルターと一時停止ポリシーを SUSPEND_EVENT_THREAD に設定しました。Classfilter には制限があり、受信したイベントを出力しても数十件を超えるイベントは表示されないため、あまり多くのイベントを受信すべきではありません。私はローカルでデバッグしており、デバッグされた Java プログラムで次のようなコマンドラインを実行しています。
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337
解決
簡単に言うと、メソッド エントリが設定されると、実行はインタープリタを介して実行されるということです。この辺には何も無いと思いますが…
これは、デバッグ モードで実行されるすべてのコードに当てはまりますが、 1.4で強化されました...HotSpot は、メソッドの入口と出口、ウォッチポイントの場合、およびシングル ステップ実行時またはブレークポイントを含むメソッド内を除いて、「フルスピード」デバッグで機能するようになりました。
他のヒント
2 つの理由:
- すべてのメソッドエントリにチェックを追加する必要があります(いくつかの方法だけを調整するオプションはありません)
- メソッドインラインは不可能になります(そのため、小さな方法は10〜100倍遅くなります)
プロファイラーや .net アプリも同様です
私は、デバッガがそれを破るために選択した1(複数可)と一致するかどうかを確認するために、すべてのメソッド呼び出しのためにウェイクアップする必要があると仮定します。それはそれはそれはそれはすべてのこれらのチェックを行うには持っていない場合よりもかなり遅い実行する前に、潜在的な試合のために、すべてのメソッド呼び出しを確認することがあるため。