簡體   English   中英

為什么我的循環輸出兩個不同的結果?

[英]Why is my loop outputting two different results?

我需要以下代碼的幫助。 通過此循環迭代隨機數組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框架在Java中計時代碼。

這可能是發生的事情*:Java開箱即用地運行代碼非常慢:它只是解釋字節碼(這比Java源代碼的效率要低得多),並花費大量額外的時間對這些運行進行一些基本的記賬,以便開機。

這是因為這無關緊要:對於絕大多數應用程序,代碼庫中的1%占用了99%的CPU和內存資源。 如果您可以優化該1%,則該應用程序的運行速度非常快。 因此,只有1%才是最重要的,而對其進行最優化就很重要。

這正是java的作用:一旦意識到(通過我提到的簿記),該VM的大部分時間都花在了這種排序代碼上,它將凍結代碼一點,使用它的大量簿記來確定分支方式往往會發生,似乎總是會保持這種條件,等等–產生恰好如此編寫的,經過高度優化的專業分支預測的優化機器代碼。 完成后,它將使用此高度優化的版本。 至少,直到烘焙到代碼中的看似永遠正確的先決條件之一不再成立,在這種情況下,優化的代碼無效,java才會退回到慢速的解釋方式,直到再次生成一個優化版本。

*)這只是Java優化和以不同方式運行的眾多方式之一。 從垃圾回收到熱點編譯,有很多方法可以修改運行時,例如: 我什至把上面的事情簡化了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM