zoukankan      html  css  js  c++  java
  • 计算Java中任意一个方法的执行时间的工具类

    如何获取一个方法的执行时间,不论是静态方法还是静态方法,不论是私有方法还是共有方法,如果该对象不能

    被实例化,使用该对象的class对象也可以,例如Arrays.class也可以作为bean传入方法中

    只有当方法是static,使用bean和bean.class都可以,但如果不是static,你使用bean.class 会报错

    该方法主要用来计算一个方法的执行时间和是否打印方法的执行时间和输出结果,我制作这个方法主要用来比较排序算法的时间复杂度

    下面是工具类的代码:

      1 package algorithm.study.utils;
      2 
      3 import java.lang.reflect.Method;
      4 
      5 /**
      6  * This class is getting a method execute time and provide some other functions.
      7  * 
      8  * @author ygh 2017年2月24日
      9  */
     10 public class MethodExecuteTimeUtils {
     11 
     12     /**
     13      * Get a method execute time using millisecond and cancel method's print return result and
     14      * execute time.
     15      * 
     16      * @param bean The method is in this bean
     17      * @param params The parameter the method execute need
     18      * @param methodName The name of the method
     19      * @param types The parameter type of the method
     20      * @return The execute time of this method
     21      * @throws Exception If <code>getMethod</code> or <code>invoke</code> fail.
     22      */
     23     public static long getMethodExecuteTime(Object bean, Object[] params, String methodName, Class<?>[] types)
     24             throws Exception {
     25         return getMethodExecuteTime(bean, params, methodName, types, false, false);
     26     }
     27 
     28     /**
     29      * Get a method execute time using millisecond and cancel print method's return result.
     30      * 
     31      * @param bean The method is in this bean
     32      * @param params The parameter the method execute need
     33      * @param methodName The name of the method
     34      * @param types The parameter type of the method
     35      * @param isPrintExecutetime Whether print the execute time in console, true is print false not
     36      * @param isViewMehtodResult Whether print the return result in console, true is print false not
     37      * @return The execute time of this method
     38      * @throws Exception If <code>getMethod</code> or <code>invoke</code> fail.
     39      */
     40     public static long getMethodExecuteTime(Object bean, Object[] params, String methodName,
     41             Class<?>[] types, boolean isPrintExecutetime) throws Exception {
     42         return getMethodExecuteTime(bean, params, methodName, types, isPrintExecutetime, false);
     43     }
     44 
     45     /**
     46      * Get a method execute time using millisecond and add some other service.
     47      * 
     48      * @param bean The method is in this bean
     49      * @param params The parameter the method execute need
     50      * @param methodName The name of the method
     51      * @param types The parameter type of the method
     52      * @param isPrintExecutetime Whether print the execute time in console, true is print false not
     53      * @param isViewMehtodResult Whether print the return result in console, true is print false not
     54      * @return The execute time of this method
     55      * @throws Exception If <code>getMethod</code> or <code>invoke</code> fail.
     56      */
     57     public static long getMethodExecuteTime(Object bean, Object[] params, String methodName,
     58             Class<?>[] types, boolean isPrintExecutetime, boolean isViewMehtodResult) throws Exception {
     59         Class<?> clazz;
     60         long executeTime = -1L;
     61         boolean isAccessiable = false;
     62         Method method = null;
     63         if (bean instanceof Class<?>) {
     64             clazz = (Class<?>) bean;
     65         } else {
     66             clazz = bean.getClass();
     67         }
     68         try {
     69             if (types == null) {
     70                 method = clazz.getDeclaredMethod(methodName);
     71             } else {
     72                 method = clazz.getDeclaredMethod(methodName, types);
     73             }
     74             isAccessiable = method.isAccessible();
     75             if (!isAccessiable) {
     76                 method.setAccessible(true);
     77             }
     78 
     79             if (isViewMehtodResult) {
     80                 executeTime = getReturnMethodExecuteTime(bean, params, method);
     81             } else {
     82                 executeTime = getMethodExecuteTime(bean, params, method);
     83             }
     84             method.setAccessible(isAccessiable);
     85             if (isPrintExecutetime) {
     86                 printExecute(clazz, methodName, executeTime);
     87             }
     88         } catch (Exception e) {
     89             throw new Exception("excute method fail");
     90         }
     91         return executeTime;
     92     }
     93 
     94     /**
     95      * Get a method execute time, use millisecond. We don't think the method whether has a return
     96      * result
     97      * 
     98      * @param bean The method is in this bean
     99      * @param params The parameters the method execute need
    100      * @param method The Method entity
    101      * @return The millisecond the method execute spend
    102      * @throws Exception If the method invoke fail
    103      */
    104     private static long getMethodExecuteTime(Object bean, Object[] params, Method method) throws Exception {
    105         long startTime = System.currentTimeMillis();
    106         method.invoke(bean, params);
    107         long endTime = System.currentTimeMillis();
    108         return endTime - startTime;
    109     }
    110 
    111     /**
    112      * Get a method execute time, use millisecond. The method must has a return result will input
    113      * the return result in console ,If the method has not return result, please call
    114      * <code>getMethodExecuteTime</code> method.
    115      * 
    116      * @param bean The method is in this bean
    117      * @param params The parameters the method execute need
    118      * @param method The Method entity
    119      * @return The millisecond the method execute spend
    120      * @throws Exception If the method invoke fail
    121      */
    122     private static long getReturnMethodExecuteTime(Object bean, Object[] params, Method method)
    123             throws Exception {
    124         long startTime = System.currentTimeMillis();
    125         Object result = (Object) method.invoke(bean, params);
    126         long endTime = System.currentTimeMillis();
    127         if (result != null) {
    128             System.out.println("result input:" + result.toString());
    129         } else {
    130             System.out.println("Warning:" + bean.getClass().getName() + "." + method.getName()
    131                     + "has not return " + "result,please setting the isViewMehtodResult as false");
    132         }
    133         return endTime - startTime;
    134     }
    135 
    136     /**
    137      * Print the execute time of method
    138      * 
    139      * @param methodName The name of the method
    140      * @param time The execute of the method
    141      */
    142     public static void printExecute(Class<?> clazz, String methodName, long time) {
    143         System.out.println(clazz.getName() + "." + methodName + " execute time: " + time);
    144     }
    145 }

    Person类,用于测试:

     1 package javareflect.demo;
     2 /**
     3  * This a person domain used test java.reflect
     4  * @author ygh 
     5  * 2017年2月26日
     6  */
     7 public class Person {
     8 
     9     private String name;
    10     
    11     private Integer age;
    12     
    13     private static String gender;
    14     
    15     public static String getGender(){
    16         return gender;
    17     } 
    18     
    19     public static void setGender(String gender){
    20         System.out.println("性别:"+gender);
    21     }
    22 
    23     public String getName() {
    24         return name;
    25     }
    26 
    27     public void setName(String name) {
    28         this.name = name;
    29     }
    30 
    31     public Integer getAge() {
    32         return age;
    33     }
    34 
    35     public void setAge(Integer age) {
    36         this.age = age;
    37     }
    38     
    39     public static void fun1(){
    40         System.out.println("this is fun1");
    41     }
    42     
    43     private void fun2(){
    44         System.out.println("this is private method");
    45     }
    46     
    47     
    48 }

    下面是测试代码:测试执行Person类里面的各种Method,静态的,私有的,共有的

     1 public class ReflectTest {
     2     @Test
     3     public void fun1() throws Exception {
     4         Person person = new Person();
     5         Object[] params = null;
     6         Class<?>[] types = null;
     7         MethodExecuteTimeUtils.getMethodExecuteTime(person, params, "fun2", types, true, true);
     8     }
     9     @Test
    10     public void fun2() throws Exception {
    11         Person person = new Person();
    12         Object[] params = null;
    13         Class<?>[] types = null;
    14         MethodExecuteTimeUtils.getMethodExecuteTime(person, params, "fun1", types, true, true);
    15     }
    16     @Test
    17     public void fun3() throws Exception {
    18         Person person = new Person();
    19         Object[] params = {12};
    20         Class<?>[] types = {Integer.class};
    21         MethodExecuteTimeUtils.getMethodExecuteTime(person, params, "setAge", types, true, true);
    22         System.out.println(person.getAge());
    23     }
    24 }

    下面是测试代码,比较Java自带的排序方法和归并排序哪个时间复杂度更高。

      1 package algorithm.study.demo2;
      2 
      3 
      4 import java.util.Arrays;
      5 
      6 import org.junit.Test;
      7 
      8 import algorithm.study.utils.MethodExecuteTimeUtils;
      9 
     10 /**
     11  * This class implement MergeSort
     12  * @author ygh
     13  * 2017年2月23日
     14  */
     15 public class MergeSort {
     16 
     17     /**
     18      * Arithmetic thoughts:
     19      * If we want to sort a array elements,we can sort their left,then
     20      * sort their right. In the left array, we can use same thought
     21      * separate the left array to halt then sort them.....
     22      * At last,it will change into tow number compare,then merge
     23      * 
     24      * @param arr The array need to sort
     25      * @param A temporary array to store elements that have sorted,its length is right-left
     26      * 
     27      * @param left The left index of elements you want to sort in this array
     28      * @param right The right index of elements you want to sort in this array
     29      */
     30     public void mergeSort(int[] sortedArr,int[] tmpArr,int left,int right){
     31         if(left<right){
     32             int mid = (left+right) / 2;
     33             mergeSort(sortedArr,tmpArr, left, mid);
     34             mergeSort(sortedArr,tmpArr, mid+1, right);
     35             merge(sortedArr, tmpArr,left,mid,right);
     36             copy(sortedArr, tmpArr,left,right);
     37         }
     38     }
     39 
     40     /**
     41      * Copy elements from temporary array to sorted array. The index range is from left to rigth
     42      * @param haltSortedArr The array need to sort
     43      * @param tmpArr The temporary array
     44      * @param left The left index
     45      * @param right The right index
     46      */
     47     private void copy(int[] haltSortedArr, int[] tmpArr, int left, int right) {
     48         for(int i=left;i<=right;i++){
     49             haltSortedArr[i]=tmpArr[i];
     50         }
     51     }
     52 
     53     /**
     54      * This method is to merge elements from haltSortedArr.now the haltSortedArr 
     55      * has became sorted half by half.The elements' index from left to mid is sorted,and the
     56      * elements' index from mid to right is sorted.So we just need to merge it to get all order
     57      * array
     58      * @param haltSortedArr The array has became sorted half by half
     59      * @param tmpArr A temporary array to store elements order.
     60      * @param left The left index of elements you want to sort in this array
     61      * @param mid The order element separator index
     62      * @param right The right index of elements you want to sort in this array
     63      */
     64     private void merge(int[] haltSortedArr, int[] tmpArr, int left, int mid, int right) {
     65         int i=left;
     66         int j=mid+1;
     67         int d = left;
     68         while (i <= mid && j <= right) {
     69             if (haltSortedArr[i] <= haltSortedArr[j]) {
     70                 tmpArr[d++]=haltSortedArr[i++];
     71             }else{
     72                 tmpArr[d++]=haltSortedArr[j++];
     73             }
     74         }
     75         
     76         if(i>mid){//If i more mid,indicate some elements have not be put in temporary array in array right
     77             while(j<=right){
     78                 tmpArr[d++]=haltSortedArr[j++];
     79             }
     80         }else{//If i less mid,indicate some elements have not be put in temporary array in array left
     81             while(i<=mid){
     82                 tmpArr[d++]=haltSortedArr[i++];
     83             }
     84         }
     85     }
     86     
     87     
     88     /**
     89      * Get a random array by size and max value
     90      * @param size The size the new array you want to create
     91      * @param maxValue The max value in the array;
     92      * @return A randow array
     93      */
     94     private int[] getRandomArray(int size,int maxValue){
     95         int []arr = new int[size];
     96         for(int i=0;i<size;i++){
     97             arr[i]=getIntRandomValue(maxValue);
     98         }
     99         return arr;
    100     }
    101     
    102     /**
    103      * Get a random that less than max value
    104      * @param maxValue The max value you get the random number
    105      * @return A random number less than max value
    106      */
    107     private int getIntRandomValue(int maxValue){
    108         return (int) (Math.random()*maxValue);
    109     }
    110     
    111     
    112     /**
    113      * This is a method to test how long time the mergeSort spend on
    114      * @param arr The array need to sort
    115      * @throws Exception
    116      */
    117     public void testMergeSort(int[] arr) throws Exception{
    118         MergeSort m = new MergeSort();
    119         Class<?>[] types = {int[].class,int[].class,int.class,int.class};
    120         String methodName = "mergeSort";
    121         int size = arr.length-1;
    122         int[] tmp = new int[size];
    123         mergeSort(arr, tmp, 0, size-1);
    124         Object[] params={arr,tmp,0,size-1};
    125         MethodExecuteTimeUtils.getMethodExecuteTime(m, params,methodName,types,true);
    126     }
    127     
    128     /**
    129      * This is a method to test how long time the javaself sort method spend on
    130      * @param arr The array need to sort
    131      * @throws Exception
    132      */
    133     public void testJavaSort(int[] arr) throws Exception{
    134         Class<?>[] types = {int[].class};
    135         String methodName = "sort";
    136         Object[] params = {arr};
    137         //although Arrays can be instance,you use Arrays.class also available,and static method also available
    138         MethodExecuteTimeUtils.getMethodExecuteTime(Arrays.class, params, methodName, types,true);
    139     }
    140     
    141     /**
    142      * print array into console
    143      * @param arr The array need to print console
    144      */
    145     public void printArray(int[] arr){
    146         System.out.println(Arrays.toString(arr));
    147     }
    148     
    149     /**
    150      * This is just a test method
    151      * @throws Exception
    152      */
    153     @Test
    154     public void fun3() throws Exception{
    155         int size = 922000;
    156         int maxValue = 9999999;
    157         //construct random array
    158         int[] arr1 = getRandomArray(size, maxValue);
    159         int[] arr2 = Arrays.copyOf(arr1, size);
    160         testMergeSort(arr2);
    161         testJavaSort(arr1);
    162     }
    163     
    164     
    165     
    166     
    167 }
  • 相关阅读:
    Effective Java 第三版——72. 赞成使用标准异常
    Effective Java 第三版——71. 避免不必要地使用检查异常
    Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常
    Effective Java 第三版——69. 仅在发生异常的条件下使用异常
    Effective Java 第三版——68. 遵守普遍接受的命名约定
    Effective Java 第三版——67. 明智谨慎地进行优化
    Effective Java 第三版——66. 明智谨慎地使用本地方法
    Effective Java 第三版——65. 接口优于反射
    Effective Java 第三版——64. 通过对象的接口引用对象
    Effective Java 第三版——63. 注意字符串连接的性能
  • 原文地址:https://www.cnblogs.com/yghjava/p/6445907.html
Copyright © 2011-2022 走看看