18

この質問にはすでに答えがあります。

私はJavaでいくつかのアルゴリズムの複雑さを分析する必要があります。そのために、私は大量の入力を与え、Javaの実装にかかる時間を測定することを計画しています。いくつかのコード行の間の時間をチェックするための最も正確で正確な方法は何ですか?ミリ秒単位の精度が必要です。


  • ではない正確に! System.nanoTime()のようなものを探していましたが、上記の質問は正式なベンチマークに関するものでした。それは何気ない読者を助けないかもしれないいくらかの深い読書を必要とします。 - Mangat Rai Modi
  • @MangatRai:「カジュアルリーダー」であることこの分野では危険です。本当に「コードのいくつかの行の間の時間をチェックする」必要があります。ありますひどくその質問で議論されていることに影響されます。それがなければ、価値のない、または誤解を招くようなデータを入手し、誤った判断を下すことになります。 - Joachim Sauer
  • あなたの質問は時間の複雑さとどのような関係がありますか?時間の複雑さは静的分析であるのに対し、パフォーマンスのベンチマークを求めていることを理解していますか? - Val
  • @ Joachim Saucerそのことは理解しています。普通の読者とは、理解のために簡単なテストをいくつか実行することを意味しました。 - Mangat Rai Modi
  • @val Time Complexityは確かに静的な分析ですが、パフォーマンスベンチマークを使って見積もることができます。最初の実行で言うと、私はn個の要素を与え、それから2n、3n ...と続きます。所要時間に対してグラフをプロットすることによって、複雑さが線形か高次多項式かを考えてみることができます。確かに、私たちは正確な時間の複雑さを得ることはしませんが、私はいくつかのコードで遊ぶことについてこれについてもっと尋ねました。 - Mangat Rai Modi

6 답변


15

あなたもナノ秒の解像度を得ることができますSystem.nanoTime()

ただし、以下の点を考慮してください。

Javaで正しいマイクロベンチマークを書くにはどうすればいいですか?


  • あなたが言及した質問は良いです。私はそれを徹底的に読みます... - Mangat Rai Modi

6

のようなライブラリを使うSpeed4j。これは、コールをベンチマークするだけでなく、ログに統計を提供するだけでなく、JMXを介してそれらをリモートで確認することもできます。 System.current ..呼び出しをコード全体に配置するよりも、このようなライブラリを使用する方が適切です。



5

顕微鏡の下に置きたい特定の方法があるとします。次のようにすることができます。

long time1 = System.nanoTime();
thatMethod();
long time2 = System.nanoTime();
long timeTaken = time2 - time1;  
System.out.println("Time taken " + timeTaken + " ns");  

コンピュータは本当に速いので、使うときにその時差が起こるかもしれませんgetTimeMillis()たぶんゼロ。したがって、nanoTime()

また使用することができますCaliper。始めるためのビデオがあります。さらに、が指している答えをよく読んでください。creichen。それにはたくさんの素晴らしいものがあります。


4

つかいますSystem.nanoTime()またはSystem.currentTimeMillis()コードの開始時間と終了時間の両方を取得します。マイクロベンチマークはJVMパフォーマンスの基本的な側面のみを測定することに注意してください。 JVMのウォームアップフェーズに注意してください。JIT開始されます。



2

long start =  System.currentTimeMillis();
// your code
long end = System.currentTimeMillis();
long diff = end-start;

または

long start =  System.nanoTime();
// your code
long end = System.nanoTime();
long diff = end-start;
long diffInMillis = diff/1000000;


  • 実行時間を知るためにcurrenttimemillisを使用しないことをお勧めします。 - SpringLearner

2

long startTime = System.currentTimeMillis();

//code lines whose time you want to calculate 

long endTime = System.currentTimeMillis();
System.out.println("Took "+(endTime - startTime) + " ms");


  • 私はとても誘惑しています-1これだけど。。。コードをフォーマットしてください。すでに述べられていることを述べないでください。 - Little Child

リンクされた質問


関連する質問

最近の質問