2011-09-19 20 views
6

私の関数がJavaで実行するのに必要なCPU時間を計算したいと思います。現在私は以下のようにしています。JavaでのCPU実行時間

long startTime = System.currentTimeMillis(); 
    myfunction(); 
    long endTime = System.currentTimeMillis(); 
    long searchTime = endTime - startTime; 

しかし、同じI/Pの場合、システム負荷によって時間が異なることが分かりました。

私の関数が実行された正確なCPU時間を取得する方法。あなたがここにあなたの答えを探すことができ

答えて

6

JVMがウォームアップするので、かかる時間は異なります。これを2回目に実行すると、常に最初のものより速くなります。 (最初にクラスをロードして静的ブロックを呼び出す必要があります)メソッドを10,000回実行すると、コードは再び高速化されます(コードをネイティブマシンコードにコンパイルするデフォルトのしきい値)

再現可能な平均マイクロベンチマークのタイミングは、最初の10,000のイテレーションを無視し、その後2〜10秒間実行することをお勧めします。

long start = 0; 
int runs = 10000; // enough to run for 2-10 seconds. 
for(int i=-10000;i<runs;i++) { 
    if(i == 0) start = System.nanoTime(); 
    // do test 
} 
long time = System.nanoTime() - start; 
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs); 

非常に重要:メソッドごとにこれらのループを1つだけ実行します。これは、使用方法に基づいてメソッド全体を最適化するためです。このような1つのビジーループがある場合、後のループは実行されず、最適化が不十分なために遅く表示されます。

0

を計算するための多くの例があり、分析に利用できるプロファイラの数(Jprofile、JProbeに、Yourkit)があります。そのようなデータ。だけでなく、この、しかし、多くの...(メモリ使用率、スレッドの詳細、などなど)

21
  1. System.currentTimeMillis()は今までwall-clock time、決してCPU時間を測定します。
  2. に壁時計が必要な場合は、System.nanoTime()currentTimeMillis()より正確で(悪くならない)ことがよくあります。
  3. ThreadMXBean.getThreadCPUTime()は、特定のスレッドがどれくらいのCP​​U時間を使用しているかを知るのに役立ちます。 ManagementFactory.getThreadMXBean()を使用してThreadMXBeanThread.getId()を取得し、興味のあるスレッドのidを見つけてください。このメソッドは、すべてのJVMでサポートされる必要はありません。
関連する問題