[英]Trying to measure elapsed time in 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());
}
}
如果您想要精确测量经过的时间,请使用System.nanoTime()
。
从 Java 文档:
public static long nanoTime()
返回最精确的可用系统计时器的当前值,以纳秒为单位。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。 返回的值表示自某个固定但任意的时间以来的纳秒(可能在未来,因此值可能为负)。 此方法提供纳秒精度,但不一定提供纳秒精度。 不保证值的更改频率。 由于数值溢出,跨越大约 292 年(263 纳秒)的连续调用之间的差异将无法准确计算经过的时间。
例如,要测量执行某些代码所需的时间:
long startTime = System.nanoTime(); // ... the code being measured ... long estimatedTime = System.nanoTime() - startTime;
从文档:
Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已用当前日期和时间初始化:
您必须在循环后获取一个新实例,并以毫秒为单位获取该实例的时间。
此外,一个简单循环的 300 次迭代根本不可能在任何时间注册,即使以毫秒为单位。 您可能想要尝试 30 万 (300000) 次或更多次迭代。
另请注意,即使getTimeInMillis()
返回特定的毫秒数,请注意它可能不会经常更新。 它可能只每 10 毫秒左右更新一次(当系统滴答发生时)。 这完全取决于您的操作系统实现。
long start = System.currentTimeMillis();
/*** do stuff***/
double elapsed = (System.currentTimeMillis() - start) / 1000.0;
有点清楚为什么你的选择没有按预期的方式工作。
Calendar 代表一个时刻,上面有各种依赖于语言环境的操作,而不是像一个正在运行的时钟。
正如 Greg 建议的那样,您应该进行更多的迭代。 他的论点是有效的 - 从统计学上讲,拥有更大的样本会产生更准确的结果(这将消除由于不可控事件(如 gc、环境等)造成的随机偏差)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.