使用System.currentTimeMillis()时出现问题;在Java中

时间:2019-05-21 03:10:46

标签: java algorithm

在第n个斐波那契数的计算中,我试图观察不同输入所花费的时间,但是对于第一个输入,输出为<50ms,对于其余输入,输出为0ms 为什么这样?

import java.io.*;
import java.util.*;
class fib{
    long fibo(int s){
        if(s==1 ||s==2)
        return 1;
        else return fibo(s-1)+(s-2);
    }
}
class fibrec{
    public static void main(String args[]) throws java.io.IOException{
        BufferedWriter wr=new BufferedWriter(new FileWriter("C:/Users/91887/desktop/books/java/foo3.txt"));
        fib f=new fib();
        Random rand=new Random();
        int input[]=new int[10];
        for(int p=0;p<10;p++){
            long st=System.currentTimeMillis();
            int i=rand.nextInt(12000);
            wr.write("Input : "+i+"\nOutput : "+f.fibo(i)+"\n");
            long et=System.currentTimeMillis();
            wr.write("Time taken = "+(et-st)+"ms\n\n");
            System.out.println(st+"\t"+et+"\t"+(et-st));
        }

        wr.close();
    }
}

2 个答案:

答案 0 :(得分:2)

毫秒时钟的粒度最好为 1毫秒 1

但是很明显,循环迭代的执行时间不到一毫秒。使用auto uStride = sizeof( vertex_t ), uOffset = 0u; _Drawing.pContext->PSSetShader( pTexture == nullptr ? _Drawing.pStandardPixelShader : _Drawing.pTexturedPixelShader, nullptr, 0 ); _Drawing.pContext->PSSetShaderResources( 0, 1, &pTexture ); _Drawing.pContext->IASetIndexBuffer( pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 ); _Drawing.pContext->IASetVertexBuffers( 0, 1, &pVertexBuffer, &uStride, &uOffset ); _Drawing.pContext->IASetPrimitiveTopology( _Topology ); _Drawing.pContext->DrawIndexed( vecIndices.size( ), 0, 0 ); 无法精确测量毫秒以下的时间间隔。这就是为什么您得到零。

第一次测量的解释是35毫秒,这是由于JVM预热效应引起的。这些可能包括:

  • 加载和初始化库代码所需的时间 2
  • JIT编译代码所需的时间,并且
  • 在加载和JIT编译期间或之后,(可能的)GC占用的时间。

第二,我注意到您的时间测量包括打印数字所花费的时间。您应该在第二次调用之后将 移到该位置以获取时钟值,因为它可能很重要。

最后,如果您想获得可重复的结果,则应该自己明确地植入System.currentTimeMillis()种子,而不要依赖操作系统来随机分配种子。而且我不认为您还是应该使用随机输入来对Fibonacci算法进行基准测试...


1-输出中的数字表明实际上是1毫秒...

2-例如,Random实例的初始化和构造需要进行OS调用以获得一些“熵”,以为随机数生成器提供种子。该应该是快速的,但是在某些情况下可能不是这样。就您而言,这是在您开始测量时间之前发生的...

答案 1 :(得分:0)

两次调用System.currentTimeMillis()之间的代码执行速度太快(在第一次迭代之后),无法捕获任何差异。如果您使用的是System.nanoTime(),那么您会发现有所不同。

关于为什么第一次迭代比后续迭代慢的原因,那是因为Java使用即时(JIT)编译器在运行时优化代码。