我写了一个简单的秒表课程如下。
public class StopWatch
{
private long startTime;
private long stopTime;
private boolean isRunning;
public void Start()
{
this.startTime=System.currentTimeMillis();
this.isRunning=true;
}
public void Stop()
{
this.stopTime=System.currentTimeMillis();
this.isRunning=false;
}
public long timeElapsed()
{
if(isRunning)
{
return ((System.currentTimeMillis()-startTime));
}
else
{
return ((stopTime-startTime));
}
}
public static void main(String[] args)
{
StopWatch s=new StopWatch();
try
{
s.Start();
int sum=0;
for( int i=0;i<=10;i++)
{
sum=sum+i;
}
s.Stop();
long timetaken=s.timeElapsed();
System.out.println(timetaken);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
如果我添加+ 100L来停止时间,那么我的回答为100.出于某种原因,starttime和stoptime都具有相同的值,减法为0.不确定为什么会发生这种情况。
我还把100000作为循环计数器,甚至给了我0.虽然复制粘贴代码的值为10 in for循环。
在纳秒时它工作正常,我试图检查Java中自动装箱带来的性能问题。
答案 0 :(得分:4)
for( int i=0;i<=10;i++) { sum=sum+i; }
上述代码的执行时间为less than a millisecond
。试试System.nanoTime()
答案 1 :(得分:1)
对于currentTimeMillis正在使用的时钟,事情可能运行得太快了? 此函数以毫秒为单位返回值,但我认为不需要它具有毫秒的分辨率。
事实上:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#currentTimeMillis()
答案 2 :(得分:0)
代码
for( int i=0;i<=10;i++) {
sum=sum+i;
}
在不到一毫秒的时间内执行:)使用类似
的内容for( int i=0;i<=10;i++) {
sum=sum+i;
Thread.sleep(100L);
}
看到结果,虽然我不确定你的目标是什么。
答案 3 :(得分:0)
实际上两个时间都是相同的,这就是它返回0的原因。
在stop方法的顶部使用它,它将给出正确答案:
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 4 :(得分:0)
要添加到其他答案,根据您的系统,System.currentTimeMillis()
实际上不一定计算到最接近的毫秒。