程序性能测试

本文介绍了一种使用Java动态代理和反射机制测量代码执行时间的方法。通过实现特定接口并使用Handler处理方法调用前后的时间记录,可以有效地评估ArrayList与LinkedList等不同数据结构的性能表现。
摘要由CSDN通过智能技术生成

我们知道java提供了System.currentTimeMillis()方法可以得到毫秒级当前时间,然后可以根据执行代码块后的时间差来知道执行当前代码所耗费的时间,但总是写这样的代码是很枯燥的,我们可以通过java的java.lang.reflect.Proxy和,java.lang.reflect.InvocationHandler利用动态代理来解决上面问题。

首先创建一个接口:


package com.king.coding;
/**
*
* 描述:一句话描述
* 作者:Andy.Liu
* 时间: 2012-7-3 上午07:43:58
*
**/
public interface ICode {
public void doTestArrayList();
public void doTestLinkedList();
}

 

实现这个接口:


package com.king.coding;

import java.util.ArrayList;
import java.util.LinkedList;

/**
*
* 描述:实现测试接口
* 作者:Andy.Liu
* 时间: 2012-7-3 上午07:45:05
*
**/
public class CodeImpl implements ICode {
public static final int NUM_SIZE = 10000;
private ArrayList<Integer> array = new ArrayList<Integer>();
private LinkedList<Integer> link = new LinkedList<Integer>();
public CodeImpl() {
for(int i = 0; i <NUM_SIZE;i++){
array.add(new Integer(i));
link.add(new Integer(i));
}
}

 

动态代理获取程序耗费时间差:


package com.king.coding;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**

* 描述:动态代理测试的方法
* 作者:Andy.Liu
* 时间: 2012-7-3 上午07:51:56
**/
public class Handler implements InvocationHandler {

private Object obj;
public Handler(Object obj){
this.obj = obj;
}

public static Object newIntanse(Object obj){
Object result = Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),new Handler(obj));
return result;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
Object result;
try{
System.out.println("Hanlder begin method"+ method.getName());
long start = System.currentTimeMillis();
result = method.invoke(obj, args);
long end = System.currentTimeMillis();
System.out.println("Handler the method "+ method.getName()+" lasts "+ (end-start)+"ms");
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("Handler end method "+ method.getName());
}
return null;
}

}

@Override
public void doTestArrayList() {
for(int i=0;i<NUM_SIZE;i++){
array.get(i);
}
}

@Override
public void doTestLinkedList() {
for(int i=0;i<NUM_SIZE;i++){
link.get(i);
}
}

}

 

测试:


package com.king.coding;
/**

* 描述:测试性能
* 作者:Andy.Liu
* 时间: 2012-7-3 上午08:08:22
**/
public class TestCode {

/**
*TODO:TODO
*Author:Andy.Liu
*Create Time:2012-7-3 上午08:08:22
*TAG:@param args
*Return:void
*/
public static void main(String[] args) {
ICode icode = (ICode) Handler.newIntanse(new CodeImpl());
icode.doTestArrayList();
icode.doTestLinkedList();
}

}

可以明显的比较出两个方法执行所花费的时间。

当然我们需要多次比较求平均值这样得到的结果才更有说服力。

转载于:https://www.cnblogs.com/liuzenglong/archive/2012/07/03/2574110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值