5

Yourkit 8.0を使用して、Mac OS X(10.5.7、Apple JDK 1.6.0_06-b06-57)で実行されている数学的に集中的なアプリケーションのプロファイリングを行っていますが、CPUプロファイリングの結果に奇妙な動作が見られます。

たとえば、サンプリングを使用してプロファイリングを実行したところ、アプリケーションの10分間の実行時間の40%がStrictMath.atanメソッドに費やされたことが報告されました。私はこれが不可解であることに気づきましたが、私はそれを一言で理解し、atanを非常に単純な多項式フィットに置き換えるのに少し時間を費やしました。

アプリケーションを再度実行すると、以前とほぼ同じ時間(10分)かかりましたが、アタンの交換はプロファイリング結果のどこにも表示されませんでした。代わりに、他の主要なホットスポットの実行時の割合は、それを補うために単純に増加しました。

要約する:

StrictMath.atanの結果(ネイティブメソッド)
合計実行時間:10分
メソッド1:20%
メソッド2:20%
メソッド3:20%
StrictMath.atan:40%

単純化された純粋なJavaatanの結果
合計実行時間:10分
方法1:33%
方法2:33%
方法3:33%

(メソッド1、2、3はatan呼び出しを実行しません)

この振る舞いはどうなっているのでしょうか?EJ-TechnologiesのJProfilerを使用しても同じ結果が得られました。JDKプロファイリングAPIは、少なくともOS Xでは、ネイティブメソッドの不正確な結果を報告しているようです。

4

6 に答える 6

3

これは、サンプルがいつ取得されるかの不一致が原因で発生する可能性があります。したがって、たとえば、メソッドがかなりの時間を使用するが、実行にそれほど時間がかからない場合、サンプリングがそれを見逃す可能性があります。また、サンプル中にガベージ コレクションが発生することはないと思いますが、一部のコードで大量のガベージ コレクションが発生すると、サンプルに表示されずにスローダウンに大きく寄与する可能性があります。

同様の状況で、1 回はトレースで、もう 1 回はサンプリングで、2 回実行すると非常に役立つことがわかりました。メソッドが両方に表示される場合、おそらく大量の CPU を使用しています。それ以外の場合は、サンプリング プロセスのアーティファクトである可能性があります。

于 2009-07-07T23:58:16.967 に答える
0

3 つのメソッドに渡されるパラメーターを確認することをお勧めします。戻り値の生成や、多くの一時オブジェクトを作成するメソッドに時間が費やされている可能性があります。

于 2009-07-08T22:02:32.440 に答える
0

Java メソッドは十分に小さい場合はインライン化できますが、ネイティブ メソッドはさまざまな規則でインライン化されることに注意してください。メソッドがインライン化されている場合、プロファイラーには表示されません (もちろん、とにかく YourKit ではありません)。

于 2009-07-10T16:14:18.943 に答える
0

YourKit は、サブメソッドを呼び出すコストを大幅に誇張していることがわかりました (そのロギング メソッドのためだと思います)。プロファイルが提供するアドバイスだけに従うと、HotSpot が通常これに対して優れた機能を発揮するため、関数をマージするだけで実際の利益は得られません。

したがって、変更が本当に有益かどうかをよりよく理解するために、完全にプロファイラーの外でもバッチをテストすることを強くお勧めします (当たり前のように思えるかもしれませんが、これには開発時間がかかります)。

于 2009-07-08T00:07:06.463 に答える
0

Mac を使用しているので、Java をサポートするApple の Shark プロファイラー(ADC から無料でダウンロード) を試すことができ、Apple のパフォーマンス グループはこのツールにかなりの時間を費やしています。

Nick が指摘したように、サンプル間隔が関数の実行時間に十分近く、プロファイラーが関数が実際にいつ実行されているかをほとんどチェックしない場合、サンプリングは誤解を招く可能性があります。YourKit がこれをサポートしているかどうかはわかりませんが、Shark では、サンプリング間隔をデフォルトの 10ms 以外に変更して、結果が大幅に異なるかどうかを確認できます。すべての関数の開始/終了を記録する別の呼び出し追跡モードもあります。これにより、エイリアシング エラーの可能性は完全に回避されますが、大量のデータと高いオーバーヘッドが収集されます。これは、アプリが何らかのリアルタイム処理を行っている場合に問題になる可能性があります。 .

于 2009-07-08T14:26:41.630 に答える
-1

プロファイラーはそのようなものです。

これは私が使用する方法です。

毎回動作します。

そして、これが理由です。

于 2009-07-10T13:57:54.510 に答える