2013-03-17 7 views
6

を占めることができない時間の一見多くを取る、私はの意味を理解することはできません、私のJavaコードでホットスポットを特定しました。 JProfilerは、このメソッドは平均で子孫メソッドの呼び出しにかかる時間を除き、150 (ウォームアップなしで674 μ)を取ると説明しています。 150 μはあまり見かけないかもしれませんが、このアプリケーションでは、これはユーザーに追加されています(またユーザーにも馴染みがあります)。したがって、それは私にとって重要です。Javaメソッドは、私がJProfilerをを使用して

私は自分自身でこの方法を異なる方向に最小限に抑えましたが、それほど役に立ちません。私はJProfilerを報告期間(150 μ s)は、このメソッドのコードについて単にであり、それはgetAuthorizationisDeniedresetFieldなどを実行するのにかかる時間が含まれていないことを十分に強調することはできません。これはまた、このコードをポストすることから始まり、多くの文脈なしにこのコードで始まり、その後の子孫メソッド呼び出しではないようだからです。

あなたは私は幽霊を見ている:)とにかく、お時間に感謝を感じる場合はたぶん、あなたはなぜ–を主張することができます!プロファイラは、常に正確なタイミングを与えないよう

+1

プロファイリングにはウォームアップ期間(JITの場合)が必要です。あなたはウォームアップしていますか? JITは無効になっていますか? – Java42

+0

それは良い点です。私はこれについて知っていたが、ボールをそこに落とした可能性がある。私は自分の投稿を更新し、いくつかのウォームアップラウンド後にかかる時間の長さで、私はそれが過度であるという意見がまだ残っているかどうかについて分かれています。おそらく:) –

+2

JProfilerでCPUサンプリングまたは動的計測を使用していますか? –

答えて

0

私は方法にあなたを自分の時間を示唆しています。

少なくとも2秒間だけ、このコードと時間それとマイクロベンチマークを作成します。メソッド呼び出しの違いを調べるには、それらをコメントアウトし、返す値をハードコードします。あなたを遅くすることができ

+1

サンプリングプロファイラーによって時折不正確なタイミングが報告された2つの理由は、1)JITがインラインそのメソッドは決して独立して報告されることはありません。呼び出されたメソッドも(ウォームアップ後も)独立してレポートされますか?そうでない場合、それらはインライン化されてもよく、その場合、その時間はassertReadAuthorizationForFields()に不正確に帰される。 2)サンプリングが安定して安定した時間を記録するまでには、かなり長い時間がかかります。 JProfilerの安定しているタイミングが1回から次回に安定していますか? – AaronD

1

候補の行動:

  • 主な効果:明らかに反復。あなたはフィールドの多くを持っている場合...あなたは
  • 主な効果はかなり重要である、平均で14を言う:ホットスポットのインライン化と呼ばれる方法は、あなたの時間に含まれている意味します - そして、あなたのメソッド呼び出し(s)が使用しているため、これが顕著になる可能性反射。 getAppropriatePropertyFieldsは、クラスフィールド定義のメタデータをイントロスペクションします。 resetFieldはsetterメソッドを動的に呼び出します(おそらくMethod.invoke()を使用します)。パフォーマンスが必要な場合は、HashSet(Map ElementClass-> FieldMetadataAndMethodHandle)を介してキャッシュを使用することができます。これには、setterメソッドのMethodHandle(method.invokeを使用するのではなく遅い)が含まれている可能性があります。その後、アプリケーションの起動時にのみ反映され、JVMの高速なdynamicInvokeサポートが使用されます。
  • マイナー効果 - 反復回数を掛けた:ステート名とプロパティ名の配列が非常に大きく、プリミティブフィールドを使用する場合、メソッド呼び出し中にある程度のコピーが必要になります(メソッドパラメータは '値は実際には参照渡し/コピーのプリミティブを意味します)
0

FieldUtilはReflectionを使用しており、使用しているフィールドをキャッシュしません。

関連する問題