2011-09-19 342 views
6

我想计算我的函数在Java中执行多少CPU时间。目前我正在做如下。Java中的CPU执行时间

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

但我发现,对于相同的I/P,我根据系统负载得到不同的时间。

那么,如何获得我的函数执行的确切CPU时间。

回答

6

随着JVM预热,所花费的时间将有所不同。第二次运行时总是会比第一次快。 (第一次加载类并调用静态块)在运行方法10,000次后,它会再次更快(将代码编译为本地机器代码的默认阈值)

要获得可重现的平均值微型基准测试的时机,我建议你忽略前10000次迭代,并在此之后运行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); 

非常重要:只有做好每方法这些循环中的一个。这是因为它基于如何使用它来优化整个方法。如果你有一个像这样的繁忙循环,后面的循环会显得比较慢,因为它们没有运行并且会被优化得很差。

0

有许多分析器(Jprofile,JProbe的,Yourkit)可用来分析这样的数据。不但如此,但更多...(如内存利用率,线程细节等)