首页 > 代码库 > 统计方法运行时间【Java实现】

统计方法运行时间【Java实现】

接口Command:定义命令的执行操作

package common;public interface Command {		// 运行方法	void run();}

 CommandRuntime 类:统计命令运行时间,使用命令模式

package common;public class CommandRuntime {        private Command command;        public CommandRuntime(Command command)     {        this.command = command;    }    public long runtime() {                long start = System.currentTimeMillis();        command.run();        long end = System.currentTimeMillis();                return end-start;    }    }

CombinationCommand:  解决组合问题的命令, 采用类适配器模式:

package algorithm.problems;import algorithm.permutation.Combination;import common.Command;public class CombinationCommand extends Combination implements Command {    public CombinationCommand(int n) {        super(n);    }    public void run() {        solution();    }}

CombinationRuntime: 测量组合问题的运行时间

package algorithm.problems;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import common.CommandRuntime;public class CombinationRuntime {		public static void main(String[] args)	{		try {			BufferedWriter fileWriter = new BufferedWriter(new FileWriter("runtime.txt"));			fileWriter.write("runtime: ");			fileWriter.newLine();			for (int i=1; i < 30; i++) {				   CommandRuntime comRuntime = new CommandRuntime(new CombinationCommand(i));				   long runtime = comRuntime.runtime();				   fileWriter.write( "n = " + i + " : " + runtime + " ms");				   fileWriter.newLine();			}			System.out.println("over.");			fileWriter.close();					} catch (IOException e) {			e.printStackTrace();		} catch (Exception e) {			e.printStackTrace();		}			}}

  另外一种使用反射机制实现的运行时间测量框架:

 

package common;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class RuntimeMeasurement {        public RuntimeMeasurement(int maxsize) {        this.maxsize = maxsize;        time = new double[maxsize];    }        // 问题最大规模: 以 10 的 size 次幂计    private int maxsize ;        // 运行时间以 ms 计    private double[] time ;        /**     * measureTime : 对指定类型的对象调用指定参数列表的指定方法,并测量其运行时间     * @param type  指定对象类型,必须有一个 参数类型为 int 的公共构造器方法     * @param methodName  指定测试方法名称,要求是空参数列表     */    public void measureTime(Class<?> type, String methodName)    {        try {             Constructor<?> con = type.getConstructor(int.class);             Method testMethod = null;             for (int i = 0; i < time.length; i++) {                      Object obj = con.newInstance(power10(i+1));                  testMethod = type.getMethod(methodName, new Class<?>[]{});                  long start = System.nanoTime();                    testMethod.invoke(obj, new Object[] {});                  long end = System.nanoTime();                  time[i] =  ((end - start) / (double)1000000) ;                       }                      } catch (Exception e) {                e.printStackTrace();                System.out.println(e.getMessage());        }                }        /**     * showTime : 显示已经测量获得的运行时间,在 measureTime 方法调用后调用该方法。     */    public void showTime()    {        for (int i=0; i < time.length; i++) {            System.out.printf("n = %12d : " , power10(i+1));                System.out.printf("%12.3f\n", time[i]);            }    }    private int power10(int n)    {        int result = 1;        while (n > 0) {            result *= 10;            n--;        }        return result;    }    }

 

统计方法运行时间【Java实现】