2016-03-24 9 views
4

もっと速い方法は何ですか?より速いのは何ですか? System.currentTimeMillis()またはDate()。getTime()?

System.currentTimeMillis() 

または

new Date().getTime()? 

は、経過時間を知るためのより高速な解決策はありますか?

+1

もっと速いとはどういう意味ですか?より少ないCPUサイクルのように?なぜそれは重要ですか?しかし、 'System.nanoTime()'を使ってより正確なメソッドがありますが、2回取得して_elapsed_時間を自分で計算する必要があります。 – Thomas

+1

[Javaで経過した時間はどのように測定するのですか?](http://stackoverflow.com/questions/1770010/how-do-i-measure-time-elapsed-in-java)を参照してください。 –

+0

私は 'long now = System.currentTimeMillis();を使用しています。 long elapsedTime = now - prevTime; ' – Igor

答えて

9

あなたは

new Date() 

を行う場合には、

/** 
* Allocates a <code>Date</code> object and initializes it so that 
* it represents the time at which it was allocated, measured to the 
* nearest millisecond. 
* 
* @see  java.lang.System#currentTimeMillis() 
*/ 
public Date() { 
    this(System.currentTimeMillis()); 
} 

を呼び出すので、にSystem.currentTimeMillis()を呼び出して、あなたはすぐに捨てるオブジェクトを作成します。

あなたが非常に幸運であれば、エスケープ解析によって冗長オブジェクトが削除され、パフォーマンスはほぼ同じになります。

long start = System.currentTimeMillis(); 
// do something 
long time = System.currentTimeMillis() - start; 

ノートを

しかし、私は中にキックされますエスケープ解析を前提とせず、ただ呼び出す:

  • オブジェクトの作成が高速であり、そしてそれは冗長だにもかかわらず、Dateオブジェクトが小さいです安価に作成できます。しかし、それはあなたのシステムのオブジェクトの数とb)あなたがそれを記憶することを試みるならば、あなたのテストの一般的なノイズにa)貢献します。バリエーションを減らし(コードを高速化するために)、メモリ割り当てを減らしたい、特に冗長なメモリ割り当てが必要です。
  • これは1 msまでしか正確ではなく、これが実行されている間にシステムが時刻を修正した場合、それは間違っている可能性があります(ただし負でもあります)。しかし、これはめったに劇的な方法ではなく、わずかな割合で外れている可能性があります。システム上で起こっている他の事柄による時間の変化を考えれば、これが最大の問題であれば、あなたは非常に幸運でしょう。
  • 代わりにSystem.nanoTime()を使用できますが、これは独自のドリフトを持つことができます。より長い時間にわたって、例えば、時間、System.currentTimeMillis()をより正確にすることができます。
  • マイクロベンチマークを作成しようとしている場合は、コードがウォームアップされていることを確認します。すなわち、この段階でコードが暖かくない可能性が高いので、最初の2〜10秒を無視する。
関連する問題