您的位置:首页 > 编程语言 > Java开发

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

2014-10-20 19:20 369 查看
接口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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: