2016-11-22 43 views
0

比方说,我有以下的for循环,我想时间:测量花费执行代码的时间

for(int i = 0; i < list.size() - 1; i++) {  
{ 
// call other methods, let's say call other 3-4 methods 

} 

所以,如果我想衡量for循环需要与一个运行在多少时间在for循环之前和之后构建Java long time = System.nanoTime();,它是否也会测量我要调用的方法内部花费的时间?

或者,如果我不调用其他方法,只是将所有代码放在我的for循环中,它会花费更多的时间比如果我只是调用其他方法?

+0

花费在循环中的时间取决于花费在其中的方法的时间......所以问题是什么? – AxelH

+1

可能的重复[如何在Java中编写正确的微基准测试?](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java ) – rkosegi

回答

1

计时器只计算它开始和结束的时间差。它不知道在开始和结束之间发生了什么。因此,如果将所有代码转储到for循环中,或者直接调用这些方法而不是内联它们都无关紧要。

但是,这不会给你每个单独功能所花费的时间。您可能需要查看Java profilers以更系统的方式获得结果。

0

System.nanoTime()返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。

从Java的文档:

此方法只能用于测量经过的时间,而不是 相关的系统或挂钟时间任何其他想法。返回的值 表示自一些固定但任意的起点 时间(可能在未来,因此值可能为负)后的纳秒。该方法的所有调用在 Java虚拟机的实例中都使用相同的 源;其他虚拟机实例可能会使用不同的来源。

通过使用System.nanoTime()值计算时间将计算执行该循环所用的全部时间。这将包括循环内方法的执行时间(如果它们在那里的话)。但是,如果它发生在循环内有自己的执行时间的线程,从点1到点2所经过的时间只会是启动线程所花费的时间,而不是其执行时间。


我发现了解这件事的好方法。只要写一个简单的代码:

long t1 = System.nanoTime(); 
long t2 = System.nanoTime(); 
System.out.println((t2 - t1)/1000000); 
  1. 在调试器拉这个,看看当你不适用任何断点会发生什么。

  2. 现在在#2行应用一个断点并在恢复执行前等待一段时间。

您可以看到区别。


Reference Link

+0

线程的好处!但是你可以等他们停止后,你已经全部运行;) – AxelH

+0

@AxelH只是分享我的经验/知道;)也将包括。 – Jay

+0

@AxelH对不起,我没有得到你所说的:/ – Jay

0

这里是什么,我会用做一些基本的,而不是精确的测试一个简单的例子。

首先,我们需要一些基本的方法来启动和打印时容易

public class Main { 

    static long start; 

    static void startTest(){ 
     start = System.nanoTime(); 
    } 

    static void stopTest(){ 
     System.out.format("%012.6f ms\n",(System.nanoTime() - start)/1000000.0); 
     start = -1; 
    } 
} 

单线程

让我们运行在一个空的循环测试:

startTest(); 
for(int i = 0; i < Integer.MAX_VALUE; ++i){} 
stopTest(); 

这将等待该在调用stopTest()之前循环结束并打印所需的时间。

多线程

随着不同的线程,你需要等待,他们结束,这是简单,也可以不以多种方式。这里是一个:

startTest(); 
List<Callable<String>> list = new ArrayList(); 
for(int i=0;i<5;i++){ 
    list.add(new Callable() { 
     public Object call() throws Exception { 
      for(int i = 0; i < Integer.MAX_VALUE/5; ++i){} 
      System.out.println("End of Thread"); 
      return null; 
     } 
    }); 
} 
ExecutorService es = Executors.newCachedThreadPool(); 
try { 

    es.invokeAll(list); 
} catch (InterruptedException ex) { 
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
} finally { 
    stopTest(); 
    es.shutdown(); 
} 

有了这个Executors,我们可以在同一时间等待他们结束调用所有Callable