我的程序需要帮助

时间:2010-12-06 02:41:38

标签: java profiling

我在Java import 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);
}      
}    

我想在其上添加计算时间代码,但我不知道如何使用,以及我使用的正确代码是什么。如果有任何想法,请帮助我。

2 个答案:

答案 0 :(得分:2)

System.currentTimeMillis()可以解决问题:

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

答案 1 :(得分:1)

单次拨打getGcd的时间可能会花费很少的时间,因此您很难准确可靠地测量它。

System.currentTimeMillis()方法将为您提供以毫秒为单位的挂钟时间。但是,毫秒时钟的粒度可能太粗糙。 (阅读javadoc!)。

System.nanoTime()方法给出系统时间(如javadoc所说)“纳秒级精度,但不一定是纳秒精度。”

在具有某些操作系统的多核计算机上,nanoTime()也存在问题。例如,我听说不同的核心可以有独立的纳米时钟,它们可以相互漂移。这可能导致System.nanoTime()返回非单调的值;例如如果操作系统重新安排当前线程在两个nanoTime()个呼叫之间的不同核心上运行。

如果我这样做,我会将getGcd()的调用放入一个循环,运行10,000或100,000次,测量循环的时间,并将测量的时间除以相关因子。 / p>