使用System.nanoTime()时如何确定哪个执行时间更有信誉

时间:2016-05-26 12:57:30

标签: java performance execution

当我尝试测量以下方法的性能执行速度时间时:

  public static int FFMulFast(int firstPol, int secondPol){
  int temp = 0;

  if (firstPol == 0 ||secondPol == 0)

  return 0;

 /*The multiplication is done by using lookup tables. We have used both logarithmic and exponential table for mul
 the idea is firstly look to Logarithmic table then add their powers and find the corresponding of this to exponential table */

   temp = (Log[(firstPol & 0xff)] & 0xff) + (Log[(secondPol & 0xff)] & 0xff);

    if (temp > 255) temp = temp - 255;

    return Exp[(temp & 0xff)];

 } 

现在我测量此方法的性能速度如下

 public void runABunch() {

    long start = System.nanoTime();
    int a=0x59;
   int b=0xb4;
     for (int i = 0; i < 5000000; i++)
        FFMulFast(a,b);
    long end = System.nanoTime();
    System.out.println("Time in nanoseconda: " + (end-start));
  }

这个结果约为0.1秒。

但是,当我运行相同的方法runABunch但省略时,我得到完全不同的结果,我不明白为什么这些结果完全不同,哪一个更有信誉的一个用于或一个没有为

public void runABunch() {

long start = System.nanoTime();
int a=0x59;
  int b=0xb4;

    FFMulFast(a,b);
long end = System.nanoTime();
System.out.println("Time in nanoseconda: " + (end-start));
}

另外,当我放入一些println语句时,执行时间增加了很多。任何人都知道为什么? 我尝试使用像java visualvm这样的探测器,但问题是我看不到任何东西,因为一旦我的应用程序运行完毕它就会消失。

2 个答案:

答案 0 :(得分:0)

您不应该尝试像这样手动滚动基准代码。你应该使用像JMH这样的框架。

答案 1 :(得分:0)

您的问题的答案比您想象的更简单。使用for循环的代码运行FFMulFast()方法 500万次,而忽略for循环运行相同的方法,但只运行一次< / em>的。完成相同的任务500万次总是会导致比只运行一次更长的时间。