试图用Java来衡量经过的时间

时间:2010-02-27 21:37:01

标签: java

我无法让Java时钟测量从一个简单程序的开始到结束所经过的时间(以毫秒为单位)。

我复制了以下程序。您将看到我使用了实用程序Calendar,然后打印循环之前和之后的时间。无论循环花费多长时间,循环前后打印命令显示的时间都不会改变。

你能建议一个解决方案吗?

我使用DrJava。

import java.util.Calendar;

class time
{
  public static void main(String[] args)
  {

    int sum=0;
    int i=0;
    int j=0;
    int n=300;

    Calendar cal = Calendar.getInstance();

    System.out.println("Current milliseconds since 13 Oct, 2008 are :" + cal.getTimeInMillis());

    for (i=0;i < n; i++)
    {
      sum++;
      System.out.println("ROW " + i);  
    }

    System.out.println(" Current milliseconds since 13 Oct, 2008 are :" + cal.getTimeInMillis());
  } 
}

7 个答案:

答案 0 :(得分:12)

使用

System.nanoTime();

测量经过的时间。

自Java 1.5以来,这是可用的,单调的(如果可能,method details)。

答案 1 :(得分:6)

如果您想要精确测量经过的时间,请使用System.nanoTime()

来自Java文档:

public static long nanoTime()
     

返回最精确的可用系统计时器的当前值,以纳秒为单位。

     

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示纳秒,因为某些固定但是任意时间(可能在将来,因此值可能为负)。该方法提供纳秒精度,但不一定是纳秒精度。不保证值的变化频率。由于数值溢出,跨越大于约292年(263纳秒)的连续调用的差异将无法准确计算经过的时间。

     

例如,要测量一些代码执行所需的时间:

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;

答案 2 :(得分:4)

来自文档:

  

Calendar的getInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间进行初始化:

你必须在循环之后获得一个新实例,并以毫秒为单位获取 实例的时间。

答案 3 :(得分:2)

此外,简单循环的300次迭代根本不可能在任何时间进行注册,即使以毫秒为单位进行测量也是如此。您可能想要尝试30万次(300000次)或更多次迭代。

另请注意,即使getTimeInMillis()返回特定的毫秒数,也要注意它可能不会经常更新。它可能每10毫秒左右更新一次(系统滴答发生时)。这完全取决于您的操作系统实现。

答案 4 :(得分:2)

long start = System.currentTimeMillis();

/*** do stuff***/

double elapsed = (System.currentTimeMillis() - start) / 1000.0;

答案 5 :(得分:1)

清楚地说明为什么你的选择不符合预期的方式。

日历表示一个时刻,其上有各种与语言环境相关的操作,而不是像正在运行的发条。

答案 6 :(得分:0)

正如Greg建议的那样,你应该做更多的迭代。他的论证是有效的 - 从统计学上讲,拥有更大的样本将产生更准确的结果(这将消除由于无法控制的事件(如gc,环境等)导致的随机偏差。)