2010-12-06 31 views
0

私はこのプログラムをJavaで持っています。java.util。*;私のプログラムに助けが必要

public class Euclid { 

    private static final String EXCEPTION_MSG = 
     "Invalid value (%d); only positive integers are allowed. "; 

    public static int getGcd(int a, int b) 
     { 
      if (a < 0) 
       { 
        throw new IllegalArgumentException(String.format(EXCEPTION_MSG, a)); 
       } 
       else 
        if (b < 0) 
        { 
         throw new IllegalArgumentException(String.format(EXCEPTION_MSG, b)); 
        } 

      while (b != 0) 
      { 


       if (a > b) 
        { 
        a = a - b; 
          }  
       else 
        { 
         b = b - a; 
        }  
      } 
       return a; 
     } 
    } 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 

public class EuclidGui 
{ 
    private static final String PROMPT_A = "#1"; 
    private static final String PROMPT_B = "#2"; 
    private static final String BUTTON_TEXT = "Get GCD >>"; 
    private static final String EXCEPTION_TITLE = "Input Exception"; 
    private static final String INSTRUCTIONS = "Type to integer and press 'Get GCD'"; 
    private static final String DIALOG_TITLE = "Euclid's Algorithm"; 
    private static final int FIELD_WIDTH = 6; 

public static void main (String[] args) 
{ 
final JTextField valueA = new JTextField (FIELD_WIDTH); 
final JTextField valueB = new JTextField (FIELD_WIDTH); 
final JTextField valueGcd = new JTextField (FIELD_WIDTH); 
JLabel labelA = new JLabel(PROMPT_A); 
JLabel labelB = new JLabel(PROMPT_B); 
JButton computeButton = new JButton(BUTTON_TEXT); 
Object[] options = new Object[] {labelA, valueA, labelB, valueB, computeButton, valueGcd}; 
valueGcd.setEditable (false); 
computeButton.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent evt) 
    { try 
     { 
      int a = Integer.parseInt(valueA.getText()); 
      int b = Integer.parseInt(valueB.getText()); 
      int gcd = Euclid.getGcd(a , b); 

      valueGcd.setText(Integer.toString(gcd)); 
     } 
     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e.getMessage(), EXCEPTION_TITLE, JOptionPane.ERROR_MESSAGE); 

     } 
     } 
    }); 
    JOptionPane.showOptionDialog(null, INSTRUCTIONS, DIALOG_TITLE, JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, 
    null, options, null); 
}  
}  

、私はそれに計算時間のコードを追加したいが、私はどのように考えている、といずれかのアイデアを持っている場合、私は私を助けるuse.Please正しいコードは何ですか。

+1

すべてのコードをインデントしてコードとして表示してください。 – gdj

+0

「タイムコード」の意味は? –

答えて

2

System.currentTimeMillis()は、トリックを行うだろう:

long start = System.currentTimeMillis(); 
// do stuff 
long timeTaken = System.currentTimeMillis() - start; 
+0

これは原則的に正しいですが、OPの特別なケースではおそらく動作しません。私の答えを見てください。 –

+0

スティーブンスは絶対に正しいです、それは私のところでかなり明るい見落としでした。 FWIWあなたが指摘した問題のために、nanoTimeは今まで気にしませんでした。 Millisecondsと巨大なループが進む道です! – ZoFreX

1

チャンスはgetGcdへの単一の呼び出しは、あなたはそれが信頼性が高く、正確に測定する難しさを持っていますので、少し時間がかかるだろうということです。

System.currentTimeMillis()の方法では、ミリ秒単位で測定された壁時計の時間が表示されます。しかし、ミリ秒クロックの精度はおそらくあまりにも粗すぎます。 (javadocを読んでください!)。

System.nanoTime()メソッドでは、システム時刻が(javadocのように)で「ナノ秒の精度ですが、必ずしもナノ秒の精度ではありません」と表示されます。

オペレーティングシステムによっては、nanoTime()のマルチコアマシンにも問題があります。例えば、私は、異なるコアがお互いにドリフトする可能性のある独立したnanoTimeクロックを持つことができると聞いてきました。これにより、単調でない値を返すSystem.nanoTime()が発生する可能性があります。例えば2つのnanoTime()コールの間で別のコアで動作するようにOSによって現在のスレッドが再スケジュールされている場合

私がこれをしていたら、getGcd()への呼び出しを10,000回または100,000回実行したループに入れ、ループの時間を測定し、測定された時間を関連する係数で除算します。

関連する問題