我需要以下代码的帮助。在通过此循环迭代随机数组userArray_Copy之后,纳秒的前两个结果与其余结果一致。我不知道为什么。
这是通过pastebin文件的完整代码。
https://pastebin.com/S2YWp8Gh
我已经在这个问题上停留了几个小时,任何帮助都将不胜感激。

do{
  //Resetting array and time
  for(int i = 0;i<n;i++){
      userArray_Copy[i] = userArray[i];
  }
  stopwatch.reset();
  elapsedTime = 0;
  stopwatch.start();
  bubbleSort(userArray_Copy, n);
  stopwatch.stop();
  elapsedTime = stopwatch.getElapsedTime();
  stopwatch.reset();
  System.out.println("\nSORTED ARRAY");
  for(int i = 0;i<n;i++){
      System.out.print(userArray_Copy[i]+" ");
  }

  System.out.println("\nTime taken in nanoseconds: "+elapsedTime+"\n\nRun Algorithm against unsorted array again?[Y/N]");
  char A = reader.next().charAt(0);
  if(A == ('y')||(A == 'Y')){
      runAgain=true;
  }
  else {
    runAgain=false;
    System.out.println("Average time of sorting algorithm: "+stopwatch.getElapsedTime()+"\nNumber of algorithms completed: "+AverageRuns);
  }
}while(runAgain);



static void bubbleSort(int[] userArray_Copy, int n) {

      int temp;
      for (int i = 0;i<n;i++)
         for (int j = 0 ; j < n-1 ; j++)
         {

            if ( userArray_Copy[j] > userArray_Copy[j+1] )
            {
               temp = userArray_Copy[j];
               userArray_Copy[j] = userArray_Copy[j+1];
               userArray_Copy[j+1] = temp;

            }
         }
   }


public class StopWatch
{
   private long elapsedTime;
   private long startTime;
   private boolean isRunning;

   public StopWatch()
{
      reset();
   }
   public void start()
   {
      if (isRunning)
         return;
      isRunning = true;
      startTime = System.nanoTime();
   }
   public void stop()
   {
      if(!isRunning)
         return;
      isRunning = false;
      long endTime = System.nanoTime();
      elapsedTime = endTime-startTime;
   }
   public long getElapsedTime()
   {
      if(isRunning)
      {
         long endTime = System.nanoTime();
         elapsedTime = (endTime-startTime);
         return elapsedTime;
      }
      else
         return elapsedTime;
   }
   public void reset()
   {
      elapsedTime = 0;
      isRunning = false;
   }
}

最佳答案

因为java。

这不是您在Java中计时时间的方式。

使用JMH framework设置Java时间代码。

这可能是发生的事情*:Java开箱即用地运行代码非常缓慢:它只是解释字节码(这比Java源代码的效率要低得多),并花很多额外的时间在这些运行上做一些基本的记账,以开机。

这是因为这无关紧要:对于绝大多数应用程序,代码库中的1%占用了99%的CPU和内存资源。如果您可以优化1%,则该应用程序的运行速度非常快。因此,只有1%才是最重要的,而对其进行最优化就很重要。

java正是这样做的:一旦意识到(通过我提到的簿记),该VM的大部分时间都花在了此排序代码上,它将冻结代码一点,使用其广泛的簿记来了解分支方式往往会发生,似乎总是会保持这种条件,等等–产生恰好如此编写的,经过高度优化的专业分支预测的优化机器代码。完成后,它将使用此高度优化的版本。至少,直到烘焙到代码中的看似永远正确的先决条件之一不再成立为止,在这种情况下,优化的代码无效,java会退回到缓慢的解释方式,直到再次生成一个优化版本。

*)这只是Java优化和以不同方式运行的众多方式之一。从垃圾回收到热点编译,有许多方法可以修改运行时,例如:我什至把上面的事情简化了!

08-27 05:30