【问题标题】:Why is my loop outputting two different results?为什么我的循环输出两个不同的结果?
【发布时间】:2019-07-19 22:37:18
【问题描述】:

我需要有关以下代码的帮助。在通过此循环迭代随机数组 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 arrays loops sorting iteration


    【解决方案1】:

    因为java。

    这不是你在 java 中计时的方式。

    在 java 中使用JMH framework 来计时码。

    以下是可能发生的情况*:Java 开箱即用地运行代码非常缓慢:它只是解释字节码(这并不比 Java 源代码效率高多少),并且花费大量额外时间做一些基本的簿记这些运行启动。

    这是因为这无关紧要:对于绝大多数应用程序,99% 的 CPU 和内存资源被 1% 的代码库占用。如果您可以优化这 1%,那么该应用程序将非常快。所以这 1% 才是最重要的,而优化得好才是最重要的。

    这正是 java 所做的:一旦它意识到(通过我提到的簿记)这个 VM 的大部分时间都花在了这个排序代码上,它会暂时冻结代码,使用它广泛的簿记分支趋向于哪条路,哪些条件似乎总是成立,等等——以产生高度调整的专门的分支预测优化机器代码,就是这样编写的。一旦完成,它将使用这个高度优化的版本。至少,直到嵌入代码中的看似总是正确的前提条件之一不再正确,在这种情况下优化的代码无效,java 将退回到缓慢的解释方式,直到再次生成一个优化版。

    *) 这只是 java 优化和运行方式不同的众多方式之一。从垃圾收集到热点编译,有很多方法可以像这样修改运行时。我什至把上面的内容过于简单化了!

    【讨论】:

    • 因此,在每次通过冒泡排序算法时,我都是第二次。没有失败,只有第二次关闭?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2012-06-22
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多