我正在尝试使用System.currentTimeMillis()跟踪我的程序中的时间 但是,当我尝试从结束时间中减去开始时间时,结果为零时,我知道它不应该是。我认为它可能与声明的数据类型或可能需要的类型转换有关。如何修复它以正确减去并将结果转换为秒?
参见代码:
long start=System.currentTimeMillis();
//some code executes....
long end=System.currentTimeMillis();
long result=end-start;
double seconds= TimeUnit.MILLISECONDS.toSeconds(result);
答案 0 :(得分:4)
不,你的代码很好。很可能一毫秒就没有消失。请尝试使用 System.nanoTime()
。
编辑:实际上,代码存在问题。根据{{3}}文档,“从较精细到较粗粒度的转换会截断,因此会丢失精度”,因此如果结果小于1000,则为0。
如果你想要小数秒,只需:
double seconds = result / 1000.0;
nanoTime
仍然有用,但如果代码需要足够长时间,则可能不是问题。
答案 1 :(得分:1)
预期 - 执行设置start
和end
的前两行将花费不到一秒的时间。因此,当您将差异缩减到一秒时,您将得到零。
答案 2 :(得分:1)
大多数系统无法解析一毫秒。每个时钟节拍通常在100到200毫秒的范围内。这意味着你得到毫秒传递的“块”。这使得几乎不可能像你的程序那样快速计时。赔率是在注册另一个时钟节拍之前开始和结束。
您需要按照其他地方的建议使用System.nanotime()
。也不要将一秒的一小部分转换为期望一整秒的秒。好吧,这是除非你向上舍入。
答案 3 :(得分:0)
你在开始和结束之间并没有做太多的事情,而且在处理非常少量的时间时,它并不是一个非常准确的计时器。尝试在中间做一些事情。
答案 4 :(得分:0)
System.currentTimeMillis()取决于您的操作系统平台,在方法调用之间可能不够精确,无法捕获您想要的时间段。召唤两次,一次紧接着,不太可能给你足够的时差。
您可以执行一千次代码并测量此时差,或使用JProfiler等分析工具,尽管这些通常只测量特定方法调用所需的时间。
Java 1.4和Java 5附加方法(getProcessCPUTime)有一些本机JNI库用于捕获更精细的时间戳,但目前我找不到具体的细节。