在第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();
}
}
答案 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预热效应引起的。这些可能包括:
第二,我注意到您的时间测量包括打印数字所花费的时间。您应该在第二次调用之后将 移到该位置以获取时钟值,因为它可能很重要。
最后,如果您想获得可重复的结果,则应该自己明确地植入System.currentTimeMillis()
种子,而不要依赖操作系统来随机分配种子。而且我不认为您还是应该使用随机输入来对Fibonacci算法进行基准测试...
1-输出中的数字表明实际上是1毫秒...
2-例如,Random
实例的初始化和构造需要进行OS调用以获得一些“熵”,以为随机数生成器提供种子。该应该是快速的,但是在某些情况下可能不是这样。就您而言,这是在您开始测量时间之前发生的...
答案 1 :(得分:0)
两次调用System.currentTimeMillis()
之间的代码执行速度太快(在第一次迭代之后),无法捕获任何差异。如果您使用的是System.nanoTime()
,那么您会发现有所不同。
关于为什么第一次迭代比后续迭代慢的原因,那是因为Java使用即时(JIT)编译器在运行时优化代码。