System.currentTimeMillis()的减法产生零

时间:2011-10-31 02:23:52

标签: java time types

我正在尝试使用System.currentTimeMillis()跟踪我的程序中的时间 但是,当我尝试从结束时间中减去开始时间时,结果为零时,我知道它不应该是。我认为它可能与声明的数据类型或可能需要的类型转换有关。如何修复它以正确减去并将结果转换为秒?

参见代码:

long start=System.currentTimeMillis();
//some code executes....
    long end=System.currentTimeMillis();
    long result=end-start;
double seconds= TimeUnit.MILLISECONDS.toSeconds(result);

5 个答案:

答案 0 :(得分:4)

不,你的代码很好。很可能一毫秒就没有消失。请尝试使用System.nanoTime()

编辑:实际上,代码存在问题。根据{{​​3}}文档,“从较精细到较粗粒度的转换会截断,因此会丢失精度”,因此如果结果小于1000,则为0。

如果你想要小数秒,只需:

double seconds = result / 1000.0;

nanoTime仍然有用,但如果代码需要足够长时间,则可能不是问题。

答案 1 :(得分:1)

预期 - 执行设置startend的前两行将花费不到一秒的时间。因此,当您将差异缩减到一秒时,您将得到零。

答案 2 :(得分:1)

大多数系统无法解析一毫秒。每个时钟节拍通常在100到200毫秒的范围内。这意味着你得到毫秒传递的“块”。这使得几乎不可能像你的程序那样快速计时。赔率是在注册另一个时钟节拍之前开始和结束。

您需要按照其他地方的建议使用System.nanotime()。也不要将一秒的一小部分转换为期望一整秒的秒。好吧,这是除非你向上舍入。

答案 3 :(得分:0)

你在开始和结束之间并没有做太多的事情,而且在处理非常少量的时间时,它并不是一个非常准确的计时器。尝试在中间做一些事情。

答案 4 :(得分:0)

System.currentTimeMillis()取决于您的操作系统平台,在方法调用之间可能不够精确,无法捕获您想要的时间段。召唤两次,一次紧接着,不太可能给你足够的时差。

您可以执行一千次代码并测量此时差,或使用JProfiler等分析工具,尽管这些通常只测量特定方法调用所需的时间。

Java 1.4和Java 5附加方法(getProcessCPUTime)有一些本机JNI库用于捕获更精细的时间戳,但目前我找不到具体的细节。