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
每天多学一点点 代码少敲一点点
java监测方法运行时间/效率方法的更多相关文章
- Java字符串连接的多种实现方法及效率对比
JDK 1.8(Java 8)里新增String.join()方法用于字符串连接.本文基于<Java实现String.join()和效率比较>一文,分析和比较四种自定义实现与String. ...
- Java ftp上传文件方法效率对比
Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...
- spring3.0框架检测方法运行时间测试(转)
主要利用了Spring AOP 技术,对想要统计的方法进行横切处理,方法执行前开始计时,方法执行后停止计时,得到计时方法就是该方法本次消耗时间. 步骤: 首先编写自己的Interceptor类来实现M ...
- Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次
[请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...
- java获取当前时间戳的方法
获取当前时间戳 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 n ...
- 深入分析Java的String类的方法与特点
字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- [Java]Object有哪些公用方法?
1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常. 主要是JAVA里除了8种基本类型传 ...
- centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课
centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB ...
随机推荐
- **关于PHP如何定义一个空对象(REST API如何处理空对象和空数组)
在写接口的过程当中,手机端有需求说不让返回json数组,要返回一个对象. 那么我们可以怎么做呢? 其实很简单,强制转换即可. 声明空对象: $empty_object=(object)array(); ...
- 2014多校第七场1003 || HDU 4937 Lucky Number
题目链接 题意 : 给定一个十进制n,让你转化成某个进制的数,让这个数只包含3 4 5 6这些数字,这个进制就成为n的幸运数字,输出有多少幸运数字,例如19,5进制表示是34,所以5是19的一个幸运数 ...
- 在WCF中使用消息队列
在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...
- MySql经典语句
1.三个函数: LENGTH SUBSTR LOCATE )) order by WebSiteShopUrl desc 2.序号 两种方法 第一种方法: ) ) as it 第二种方法: ; ...
- 如何开启Centos6.4系统的SSH服务
无论是Centos6.4系统的虚拟电脑还是服务器,始终感觉直接在命令行中操作不方便:比如全选.复制.粘贴.翻页等等.比如服务器就需要在机房给服务器接上显示器.键盘才操作感觉更麻烦.所以就可借助SSH( ...
- JSTL Tag学习笔记之<fn: />
在JSTL中也提供了一些标准的函数,但是几乎都是和操作字符串相关的函数,如果需要使用这类函数的话,应该引入下面的taglib: <%@ taglib prefix="fn" ...
- MDK4.6和J-LINK调试出现问题,软件自动关闭,在网上收集整理的解决办法
MDK4.6配J-LINK调试时提示升级,升级完成后,弹出下图提示框后,软件自动退出. 提示原因:由于MDK4.6能识别山寨JLINK导致.网络牛人分析如下: 今天将Keil MDK升级到了V4.54 ...
- mysql 支持中文,防止程序乱码的方法
1. 查看你的mysql的字符设置 mysql> show variables like 'character%'; +--------------------------+---------- ...
- Fiddler如何抓取使用了SSL或TLS传输的Android App流量
上篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量, 那么使用Fiddler的时候其实 也会出现与burpsuite同样的情况,解决方案同样是需要将Fiddl ...
- Android 使用全局变量传递数据
使用全局变量传递数据,所谓的全局变量类似于jee开发中的application变量.申明后,全局调用.只有当内存被清理后,才被销毁.否则一直可以调用. 还是使用点击一个button,传递一个数据到另一 ...