2016-10-02 15 views
1

jvisualvmを使用して相対的な単純なJavaプログラムをプロファイリングしようとしました。結果はやや奇妙でした:小さな4行の方法は、他の方法よりも大幅に多くの自己時間を持っています!奇妙なプロファイラの結果

public class Hub 
    public void clock() { 
     for (int i = 0; i < cogs.length; i++) { 
      cogs[i].clock(cnt, i, this); 
     } 
     cnt++; 
    } 
} 

注:この場合、cogs.lengthは8です。

これは、Cog.clockメソッドがかなり大きいので、これは奇妙です!

public class Cog 
    public void clock(int cnt, int cogid, Hub hub) { 
     if (state == State.STOP) 
      return; 
     //long code goes here 
    } 
} 

しかし、それshouldn」:私が思い付くことができる唯一のもっともらしい説明は、(この場合は8の6中)最もコグオブジェクトは、次のようにcatchedされる「停止」状態であるという事実でありますそれは大きな影響を与えます!ここでは証拠の絵がある:それは楽器(修正)それをするので

enter image description here

+0

'clock()'を何回呼び出していますか?残りのコードはどこにありますか? –

+0

Hub.clockとCog.clockの違いを明確にするために編集しました。基本的に、Hub.clockは無限ループで呼び出され、すべてのCogオブジェクトでclockを呼び出します。 –

+0

私は多くのプロファイラを信頼しません。測定は実行に影響し、多くの問題があります。ランタイムの合計が実際にわずか10ミリ秒であれば、それを忘れることができます。 JVMはすべてを適切に最適化するためにより多くのものを必要とします。あなたがスピードの問題に遭遇しなければ、あなたはそれを無視することができます(私はまた、ここで何が起こっているのかが不思議です)。それ以外の場合は、測定時間を長くして結果を送信してください。 – maaartinus

答えて

0

プロファイリングは、コードの実行中の時間に影響を与えます。呼び出しごとに12000_000回の呼び出しが実行されます。これは呼び出しごとに約750ナノ秒です。これは計測が遅くなったためであり、計測がなくてもおそらくそれは少なくなります。このような呼び出しでは、私はプロファイラーからは妥当なものは何も期待しておらず、さまざまなメソッドに対してその結果を比較しないでしょう。呼び出し回数の多いメソッドは、より少ないスコアを持つメソッドよりも高くなるでしょう(ほとんどの場合、Cog.clock呼び出しステータスを確認して終了するだけです)。 VisualVMサンプラーを試してみるかもしれませんが、十分に正確であるかどうかはわかりません。自分で時間を測定しようとするかもしれませんが(System.nanoTime()で)、それでもサブマイクロ秒の精度を保証するものではありません。