程式效能測試

來源:互聯網
上載者:User

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

}

可以明顯的比較出兩個方法執行所花費的時間。

當然我們需要多次比較求平均值這樣得到的結果才更有說服力。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.