TPTP を使用して、実行速度の遅い Java コードのプロファイリングを行っているときに、興味深いものを見つけました。私のプライベート プロパティ ゲッターの 1 つは、実行時間分析の結果で大きな Base Time 値を持っています。公平を期すために、このプロパティは何度も呼び出されますが、このようなプロパティに非常に時間がかかるとは思いもしませんでした。
public class MyClass{
private int m_myValue;
public int GetMyValue(){
return m_myValue;
}
}
わかりましたので、クラスには明らかにもっと多くのものがありますが、ご覧のとおり、getter が呼び出されたときに他に何も起こっていません (int を返すだけです)。あなたのためのいくつかの数字:
- 実行の呼び出しの約 30% は getter にあります (これを減らすために取り組んでいます)
- 実行の基本時間の約 25% がこのゲッターで費やされます
- 平均ベース時間は 0.000175 秒です
比較のために、このゲッターを使用する別のクラスに別のメソッドがあります。
private boolean FasterMethod(MyClass instance, int value){
return instance.GetMyValue() > m_localInt - value;
}
これは、平均ベース時間が 0.000018 秒 (1 桁低い) とはるかに短くなっています。
ここでの取引は何ですか?私が理解していないもの、または欠けているものがあると思います:
- ローカルプリミティブを返すのは、計算された値を返すよりも本当に時間がかかりますか?
- Base Time 以外のメトリックを確認する必要がありますか?
- これらの結果は誤解を招くものですか? 他のプロファイリング ツールを検討する必要がありますか?
編集 1:以下のいくつかの提案に基づいて、メソッドを最終としてマークし、テストを再実行しましたが、同じ結果が得られました。
編集 2:パフォーマンス テストを再実行するために、YourKit のデモ バージョンをインストールしました。YourKit の結果は、私が期待していたものにかなり近くなりました。私は引き続き YourKit をテストし、見つけたことを報告します。
編集 3: YourKit に変更すると、問題が解決したようです。YourKit を使用して、コード内の実際のスロー ポイントを特定できました。以下にいくつかの優れたコメントと投稿があります (適切に賛成票を投じました) が、YourKit を「正しい」と提案した最初の人を受け入れます。(私はいかなる方法でも YourKit と提携していません / YMMV)