java监测方法运行时间/效率方法

前言:

  这周在写一个小项目,虽然小但是是纯调外部接口的,调完了接口还不停的循环接口返回的数据(已转换JSONArray),然后再判断值,再做不同处理,关键是数据量还比较大,这刚做完还没开始上线,测试也还没开始测呢,就想着自己先看看每个方法运行效率,省的数据大了项目挂掉(循环判断好多,有时还有2个for嵌套循环),就是纯粹在时间上进行监测,没有内存和cpu的监控。

  主要利用了Spring AOP 技术,对想要统计的方法进行横切处理,方法执行前开始计时,方法执行后停止计时,得到计时方法就是该方法本次消耗时间。

步骤:

  • 首先编写自己的Interceptor类来实现MethodInterceptor类,来用于切入方法,运行计时代码
  • Spring AOP 的XML配置,配置需要监测的方法和切入方法(自定义的Interceptor)


java代码:

package com.cplatform.tencent.task;

import java.util.HashMap;
import java.util.Map;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.time.StopWatch;
/**
 * 方法运行时间测试
 * @author liuyt
 * @date   2014-11-16 下午3:39:08
 * bolgs   http://www.cnblogs.com/liuyitian/
 */
public class MethodTimeActive implements MethodInterceptor {
    /**
     * 自定义map集合,key:方法名,value:[0:运行次数,1:总时间]
     */
    public static Map<String,Long[]> methodTest = new HashMap<String, Long[]>();
    /**
     * 拦截要执行的方法
     */
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // 创建一个计时器
        StopWatch watch = new StopWatch();
        // 计时器开始
        watch.start();
        // 执行方法
        Object object = invocation.proceed();
        // 计时器停止
        watch.stop();
        // 方法名称
        String methodName = invocation.getMethod().getName();
        // 获取计时器计时时间
        Long time = watch.getTime();
        if(methodTest.containsKey(methodName)) {
            Long[] x = methodTest.get(methodName);
            x[0]++;
            x[1] += time;
        }else{
            methodTest.put(methodName, new Long[] {1L,time});
        }
        return object;
    }

}


XML配置:

<!-- 日志记录某个类中方法花费时间aop -->
    <aop:config>
        <!-- Spring 2.0 可以用 AspectJ 的语法定义 Pointcut,这里自定义要拦截方法的包所在 -->
        <aop:advisor id="methodTimeLog" advice-ref="methodTimeAdvice" pointcut="execution(* com.cplatform.tencent.sync..*.*(..))"/>
        <aop:advisor id="methodTimeLog2" advice-ref="methodTimeAdvice" pointcut="execution(* com.cplatform.tencent.utils..*.*(..))"/>
    </aop:config>
    <bean id="methodTimeAdvice" class="com.cplatform.tencent.task.MethodTimeActive"/>   

  使用AOP面向切面技术时,XML配置里面千万别忽略了以下配置:



TEST:

package test;

import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.cplatform.tencent.sync.PersistenceTicketService;
import com.cplatform.tencent.task.MethodTimeActive;
import com.cplatform.tencent.utils.AppConfig;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-configuration/*.xml"})
@ActiveProfiles("production")
public class CopyOfDBTest {

    @Autowired
    private AppConfig appConfig;    // 这是我项目里用到的  可忽略
    @Autowired
    private PersistenceTicketService persistenceTicketService;

    // 测试某个方法,这个方法内部调用了很多业务处理方法
    @Test
    public void testInsertOrUpdate() {
        persistenceTicketService.insertOrUpdate(appConfig.getTicketCityIds(), appConfig.getAgentId());
    }

    // 测试方法运行完毕后,取出定义的Map集合,取出数据
    @After
    public void testMethodActive() {
        Map<String, Long[]> map = MethodTimeActive.methodTest;
        Set<String> set = map.keySet();
        Long[] x = null;
        for(String s : set) {
            x = map.get(s);
            System.out.println(s+":"+x[0]+"次,"+x[1]+"毫秒");
        }
    }
}

  上面用到的是Spring和junit对WEB方法进行测试,具体可以参照SpringJunit4 进行单元测试



console输出:



  其实也不难,大家可能也都会,献下小丑了,欢迎拍砖。

                        写作不易,难免有疏漏和错误,还请慷慨指正,不错请推荐

   ps:欢迎转载,转载请注明出处:http://www.cnblogs.com/liuyitian/p/4101531.html



                                         每天多学一点点     代码少敲一点点

时间: 2024-10-09 16:52:21

java监测方法运行时间/效率方法的相关文章

spring3.0框架检测方法运行时间测试(转)

主要利用了Spring AOP 技术,对想要统计的方法进行横切处理,方法执行前开始计时,方法执行后停止计时,得到计时方法就是该方法本次消耗时间. 步骤: 首先编写自己的Interceptor类来实现MethodInterceptor类,来用于切入方法,运行计时代码 Spring AOP 的XML配置,配置需要监测的方法和切入方法(自定义的Interceptor) 1.自定义Intercept拦截器 package com.utis.intercept; import java.util.Hash

四中copy数组方法的效率比较

Java中copy数组的方法有四种.第一种是Object类提供的clone( )方法,第二种是java.lang.System类提供的arrayCopy( )方法,第三种是java.util.Arrays类提供的copyOf( )方法,最后一种也就是最常见的使用for循环实现数组的copy.四中执行方法由于内部实现不同当然有不同的执行效率.参考下面代码的运行结果(由于用到了相同的业务逻辑所以使用了动态代理) 代理类: package com.zly.test; import java.lang.

java获得采集网页内容的方法小结

      为了写一个java的采集程序,从网上学习到3种方法可以获取单个网页内容的方法,主要是运用到是java IO流方面的知识,对其不熟悉,因此写个小结. import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; impo

深入分析Java的String类的方法与特点

字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 JDK中提供一个名为String的类,对应字符串这个变量类型. 源码分析 既然JDK中的String类对应了字符串变量类型,为了熟练地掌握Java中字符串相关的技能,我们必须深入地分析和研究一下这个类.编码界有一句名言叫做 "源码面前,了无秘密",因此,我们第一步就是来看看String类

Java中用最有效率的方法算出2 乘以8 等於几?

Java中用最有效率的方法算出2 乘以8 等於几?2 << 3,因为将一个数左移n 位,就相当于乘以了2 的n 次方,那么,一个数乘以8 只要将其左移3 位即可,而位运算cpu 直接支持的,效率最高,所以,2 乘以8 等於几的最效率的方法是2 << 3.

实例介绍 Java(android) 回调函数使用方法

在Android开发中经常用到回调机制,其中最典型的就是控件被触发的实现方式,简单而言,如Button被Click后,是系统调用了OnClick方法,而我们为Button注册了OnClickListener监听器,当被触发Click后,OnClickListener中的OnClick方法就会被回调,我们就能在其中执行相应操作了. 下面举一个简单的例子介绍回调的实现方式: 回调函数使用的简单例子 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序

java中字符串切割的方法总结

StringTokenizer最快 ,基本已经不用了,除非在某些需要效率的场合.Scanner最慢. String和Pattern速度差不多.Pattern稍快些. String和Pattern的split 方法效率相当,常用 public   static   void  main(String [] args){ long  start = System.currentTimeMillis(); for ( int  i= 0 ;i< 100000 ;i++){ test1(); } lon

[转载]Java中hashCode与equal方法详解

转载自http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复. 这里我们首先要明白一个问题: equa

JAVA的PreparedStatement和addBatch()方法

本文介绍两个内容,为什么使用PreparedStatement?和PreparedStatement的addBatch()方法,由于工具经常用,所以先介绍addBatch()方法. 一.addBatch使用方法 昨天用JAVA做了一个导表的功能,数据量非常多,使用下面的缓冲方法非常使用. 1. 建立链接 Connection connection =getConnection(); 2. 去掉自动提交功能 Commit connection.setAutoCommit(false); 3. 预编