我无法让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());
}
}
答案 0 :(得分:12)
答案 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,环境等)导致的随机偏差。)