2017-02-17 3 views
0

私の脳は今日は機能していないかもしれませんが、メソッドの実行時間を計算し、その時間をファイルに書き込もうとしています。なんらかの理由で、長い値は0と1として書かれています。ここに関連するコードは次のとおりです。ここでなぜこれらのロングは0か1として書かれていますか?

public static void main(String[] args) { 
     //Reads numbers from file 
     Scanner numberReader; 
     //Writes execution times to file 
     BufferedWriter writer; 
     String heading = "Euclid (ms)\t\tPrime Factor (ms)\n"; 
     //Hold numbers from file 
     int num1, num2; 
     //Holds execution times 
     long startTime, endTime, elapsedTime; 

    try { 
     //Reads file 
     numberReader = new Scanner(new File(args[0])); 
     //Opens the file to write to 
     writer = new BufferedWriter(new FileWriter("comparison.txt", false)); 
     writer.write(heading); 

     //While there are more numbers to read 
     while(numberReader.hasNextInt()) { 
      //Read the numbers 
      num1 = numberReader.nextInt(); 
      num2 = numberReader.nextInt(); 

      System.out.println("Numbers: " + num1 + ", " + num2); 

      //Run the first method and calculate execution time 
      startTime = System.currentTimeMillis(); 
      System.out.println("Euclid GCD: " + euclid(num1, num2)); 
      endTime = System.currentTimeMillis(); 
      elapsedTime = endTime - startTime; 
      //Write execution time to file 
      writer.write(elapsedTime + "\n"); 

      //Run the second method and calculate execution time 
      startTime = System.currentTimeMillis(); 
      System.out.println("Prime Factor GCD: " + primeFactor(num1, num2)); 
      endTime = System.currentTimeMillis(); 
      elapsedTime = endTime - startTime; 
      //Write execution time to file 
      writer.write(elapsedTime + "\n"); 
     } 

     //Close the reader and writer 
     numberReader.close(); 
     writer.close(); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

は、サンプル出力です:

Euclid (ms)  Prime Factor (ms) 
1 
1 
0 
0 
0 
0 

任意のアイデア?

+0

あなたの 'euclid'メソッドに問題があるようです。それを投稿に追加できますか? –

+0

jmhはこの種のものにとって有用なツールであり、正確なタイミングの作業の大部分を行います。 http://openjdk.java.net/projects/code-tools/jmh/ – pvg

+0

申し訳ありませんが、印刷された書式は確定していません。私はそれを言及すべきだった。ユークリッドアルゴリズムは問題ありません。 – Pareod

答えて

2

測定しようとしているメソッドの実行は、数ビット程度です。マイクロ-秒です。これらはミリ秒に丸められた時間なので、500μs未満の時間はゼロとして出力されます。

System.nanoTime()などの高解像度タイマーを使用する必要があります。これは短い間隔を測定するために使用できますが、時間帯ではなく経過時間にのみ有効です。私。 2つの値を減算して経過時間を得ることができますが、値そのものは特定の時刻と相関しません。

ハードウェアによっては、ナノ秒の解像度が得られない場合がありますが、ミリ秒よりもはるかに優れていることに注意してください。

+0

私はこれを試しますが、デバッグして時代の値を見ると、それらは複数の数字になります。経過時間の1つの例は14492と表示されます。 – Pareod

+0

これは問題を解決するようですが、私は上記のコメントでまだ混乱しています。 – Pareod

+0

その値「14492」はナノ秒です。 1ナノ秒はミリ秒の1/1,000,000であり、その値は約0.014msを表し、ゼロに丸める。 milli = 0.001 micro = 0.000001 nano = 0.000000001 –

関連する問題