• 程序性能测试


    我们知道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();
    }

    }

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

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

  • 相关阅读:
    毫秒倒计时小Demo
    css3 翻转
    canvas
    html5
    css3
    一些免费的svn空间(SVN代码托管)
    Xcode 6制作动态及静态Framework
    ios 动态执行的代码
    ios nsarray对象问题
    iOS xcode 编译选项 architecture(cup架构问题)
  • 原文地址:https://www.cnblogs.com/liuzenglong/p/2574110.html
Copyright © 2020-2023  润新知