性能测量工具类——TimeMeasureUtil TimeMeasureProxy

TimeMeasureUtil:做单次时间测量。

1、为了能确保 startTime 和 endTime 都正确设置,因而采用实例对象来实现。每次测量是都能判断对象是否处在正确状态。

2、该类为工具类,即使测试时产生许多对象实例也对软件无任何影响。

public class TimeMeasureUtil {private long startTime = 0;private long endTime = 0;private TimeMeasureUtil(){}public static TimeMeasureUtil newInstance(){return new TimeMeasureUtil();}public void start(){startTime = System.currentTimeMillis();}public void end(){endTime = System.currentTimeMillis();}public long measure(){// Invalid: Before yif( startTime == 0 ){throw new IllegalStateException( "Must call metod start() first, when call method measure()." );}if( endTime == 0 ){throw new IllegalStateException( "Must call metod end() first, when call method measure()." );}if( startTime > endTime ){throw new IllegalStateException( "Must call metod start() first, when call method end()." );}return endTime - startTime;}}

使用示例:

	@Testpublic void testMeasure_ok() {TimeMeasureUtil timeUtil = TimeMeasureUtil.newInstance();timeUtil.start();// 下面这段代码用实际待测方法代替try {Thread.sleep( 1000 );} catch (InterruptedException e) {e.printStackTrace();}timeUtil.end();assertEquals( 1000, timeUtil.measure() );}


由于单次测量可能的偏差太大,没有统计意义,如下类测量平均时间!
TimeMeasureProxy:

1、默认运行20次得平均

2、给定运行次数的平均

缺陷:

1、由于是用反射实现,参数是通过 Object[ ] 来传递。有原始类型(如:byte,int,char...)参数的方法不能测试!只能用 TimeMeasureUtil 来实现测试。 

2、如果第一次执行方法后改变了某属性,而该属性改变后又会影响下一次方法的执行(可能会有不同的时间),这样的方法不能测试。可能的改进方式:先“克隆” count 个该对象,然后用这样相同属性的对象来执行方法(每个对象执行一次方法)。因为这样要求,被测试类提供“克隆”方法,“因测试而影响逻辑”不可取,所以没有实现。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class TimeMeasureProxy {// default measure countprivate int count = 20;private TimeMeasureProxy(){}private TimeMeasureProxy( int count ){this.count = count;}public static TimeMeasureProxy newInstance(){return new TimeMeasureProxy();}public static TimeMeasureProxy newInstance( int count ){return new TimeMeasureProxy( count );}public long avgTime( Object owner, String methodName, Object[] args ){// valid parameters.if( owner == null ){throw new IllegalStateException("owner can't be null.");}if( methodName == null ){throw new IllegalStateException("methodName can't be null.");}Class<?> ownerClass = owner.getClass();Class<?>[] argsClass = null;if( args != null ){argsClass = new Class[ args.length ];for( int i=0 ; i<args.length ; i++ ){argsClass[i] = args[i].getClass();}}Method method;try {method = ownerClass.getMethod( methodName, argsClass );} catch (SecurityException e) {throw new RuntimeException( e );} catch (NoSuchMethodException e) {throw new RuntimeException( e );}return totalTime( owner, method, args)/count;}long totalTime( Object owner, Method method, Object[] args ){long totalTime = 0;try {for( int i=0; i<count ; i++ ){TimeMeasureUtil timeUtil = TimeMeasureUtil.newInstance();timeUtil.start();method.invoke( owner, args );timeUtil.end();totalTime += timeUtil.measure();}} catch (IllegalArgumentException e) {throw new RuntimeException( e );} catch (IllegalAccessException e) {throw new RuntimeException( e );} catch (InvocationTargetException e) {throw new RuntimeException( e );}return totalTime;}}

使用示例:

1、待测试的类

class ForMeasureAvgTime{public void justForTest(){try {Thread.sleep( 335 );} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void justForTestWithParams( Integer age, String name ){try {Thread.sleep( 558 );} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

2、通过TimeMeasureProxy 来测试

	@Test//测量无参数方法&默认次数(20)public void testAvgTime_defaultCount() {ForMeasureAvgTime forMeasure = new ForMeasureAvgTime();TimeMeasureProxy proxy = TimeMeasureProxy.newInstance();long avgTime = proxy.avgTime( forMeasure, "justForTest", null );System.out.println( "avgTime=" + avgTime );assertTrue( (avgTime - 335) < 5 || (335 - avgTime) < 5);}@Test//测量有参数方法&给定次数(10)public void testAvgTime_giveCount() {ForMeasureAvgTime forMeasure = new ForMeasureAvgTime();TimeMeasureProxy proxy = TimeMeasureProxy.newInstance( 10 );long avgTime = proxy.avgTime( forMeasure, "justForTestWithParams", new Object[]{24, "GongQiang"} );System.out.println( "avgTime=" + avgTime );assertTrue( (avgTime - 558) < 5 || (558 - avgTime) < 5);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何看屈曲因子_Abaqus 非线性屈曲分析方法

通常情况下&#xff0c;我们只用关注产品结构本身的强度和刚度满足一定的要求或标准即可。但实际工程中&#xff0c;对于像细长类的结构、薄壁结构&#xff0c;我们还得考虑它的稳定性问题&#xff0c;这也就是我们通常所说的失稳问题或者塌陷问题。在有限元分析中&#xff0c;…

人类首张脑电波连接全图问世

来源&#xff1a;科技日报 概要&#xff1a;美国宾夕法尼亚大学的神经学家根据300名接受神经外科手术患者大脑中30000个电极的数据&#xff0c;绘制出第一张脑电波连接全图。 美国国防部高级研究计划局&#xff08;DARPA&#xff09;资助的、与“恢复活跃记忆”相关的大脑研究项…

EasyMock 简介

来源&#xff1a;https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/ 使用注意&#xff1a; a、静态方法&#xff08; static 修饰&#xff09;无法模拟。 1、使用 EasyMock 进行单元测试 通过 EasyMock&#xff0c;我们可以为指定的接口动态的创建 Mock 对…

login控件authenticate_asp.net Login控件基本属性及事件说明

当前位置:IT大杂烩>JavaScript> asp.net Login控件基本属性及事件说明asp.net Login控件基本属性及事件说明www.someabcd.com 网友分享于&#xff1a;Jun 8, 2018 9:43:39 AM原文:asp.net Login控件基本属性及事件说明 Login系列控件是微软为了简化我们的开发过程&#…

全球半导体产业迁移 中国的机遇与挑战

来源&#xff1a;36氪 概要&#xff1a;商务部24日发布公告说&#xff0c;以附加“限制性条件”的形式批准了日月光半导体收购矽品精密股权案。 商务部24日发布公告说&#xff0c;以附加“限制性条件”的形式批准了日月光半导体收购矽品精密股权案。这个附加的“限制性条件”&…

dts同步常见问题_阿里云DTS数据同步常见问题(一)

阿里云的数据同步工具DTS确实是一件非常不错的工具&#xff0c;可以实现不同数据源之间的数据迁移、数据同步&#xff0c;只需要配置好两端的数据源就可以自动实现&#xff0c;不在需要人为的操作&#xff0c;非常的方便。但是如果不熟悉DTS的话呢&#xff0c;会遇到各种各样的…

暂时

/*** 使HTML的标签失去作用* * param input* 被操作的字符串* return String*/public static final String escapeHTMLTag(String input) {if (input null) {input "";return input;}input input.trim().replaceAll("&", "&&qu…

mysql的程序怎么升级成mysqli_如何将mysql更改为mysqli?-问答-阿里云开发者社区-阿里云...

首先要做的可能是将每个mysql_函数调用都替换为等效函数mysqli_&#xff0c;至少在您愿意使用过程式API的情况下-考虑到您已经有一些基于MySQL API的代码&#xff0c;这将是更简单的方法是一种程序性的。为了解决这个问题&#xff0c;“ MySQLi扩展功能摘要”绝对是有用的。例如…

待完成任务列表

1、将 HT 控件全部对象化。 a、抽象出 print 方法 b、使用构建器模式控制参数&#xff1a;部分是必须在创建对象时给定&#xff0c;部分是可以给定也可以使用默认值。 2、开发——小助手&#xff0c;工具 a、要对“名称定义”、“单元测试”进行&#xff0c;添加&#xff0c;编…

mysql插入实现存在更新_mysql 记录不存在时插入 记录存在则更新的实现方法

mysql 记录不存在时插入在 MySQL 中&#xff0c;插入(insert)一条记录很简单&#xff0c;但是一些特殊应用&#xff0c;在插入记录前&#xff0c;需要检查这条记录是否已经存在&#xff0c;只有当记录不存在时才执行插入操作&#xff0c;本文介绍的就是这个问题的解决方案。问题…

阿里智能对话交互实践与创新

来源&#xff1a;人工智能头条 作者 &#xff1a;孙健&#xff0c;李永彬&#xff0c;陈海青&#xff0c;邱明辉 概要&#xff1a;过去 20 多年&#xff0c;互联网及移动互联网将人类带到了一个全新的时代&#xff0c;如果用一个词来总结和概括这个时代的话&#xff0c;「连接」…

HT 相关

设置系统语言——日语测试用 解决方案 按照以下说明将系统语言环境更改为您所需的语言&#xff1a; 更改 Windows XP、Vista 和 Windows 7 的系统位置 注&#xff1a;必须以具有管理权限的用户身份登录。 单击开始 > 控制面板。 Windows 7 和 Vista&#xff1a;依次单击…

IDC Future Scape : 2018年全球物联网十大趋势性预测,5G将加速IoT发展

作者&#xff1a;Dudu 概要&#xff1a;预计到2021年前后&#xff0c;5G、物联网数据分析、物联网支出管理、区块链、物联网服务将成为市场主流。 2019年&#xff0c;IoT行业中&#xff0c;边缘基础设施将成为市场主流&#xff0c;多用于单个部门的业务板块中。 到了2020年&am…

mysql 解释 游标赋值_Mysql_游标

MySQL中的游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段&#xff0c;就本质而言&#xff0c;游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。MySQL中的游标的语法如下&#xff1a;DECLARE cursor-name CURSOR FOR…

意见征集,世界AI智商评测量标准2018年新版讨论方案

来源&#xff1a;未来智能实验室 对于本次2018年世界AI智商评测的量表更新 &#xff0c;有两个问题希望得到您的意见&#xff1a;1.如果按上述智力因素进行增加&#xff0c;您认为他们的权重应该是多少&#xff0c;其他已有的智力因素权重应该调整为多少&#xff1b;2.您认为考…

mysql查看system函数_mysql系统信息函数

1、VERSION() 返回数据库的版本号SELECT VERSION() -- 5.0.67-community-nt2、CONNECTION_ID() 返回服务器的连接数SELECT CONNECTION_ID() -- 33、DATABASE()、SCHEMA 返回当前数据库名4、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()、CURRENT_USER 返回当前用户S…

chm文件大不开

1、如果提示是&#xff1a;如果提示是Internet Explorer 不能链接到您请求的网页或者打开后“页面无法显示”。请下载chm.reg&#xff0c;执行。或在要打开的CHM文件上右键属性&#xff0c;会在底下属性中多了一个“解除锁定”&#xff0c;点击后就可以正常显示了。 chm.reg内容…

人工智能的价值地图:AI产业增强革命的模式与路径

来源&#xff1a;腾讯研究院 概要&#xff1a;人工智能所蕴含的力量让人向往又恐惧。2016年的两次人机大战第一次让公众认识到人工智能的强大力量。 “智造”并不是一个新词&#xff0c;几年前&#xff0c;我们可以看到数字技术从虚拟世界向实体世界渗透。3D打印、激光切割等一…

怎样打开mysql进程数_mysql查看最大打开进程数

今天在群里刚刚知道这个查看打开最大进程数的命令&#xff0c;下面来看一下吧~ cat /proc/27095/limits | grep Max open files 查看mysql最大打开进程数的命令 我们应该如何知道那个标黄的进程呢&#xff0c;想起来前几天刚刚学过的命令了吗&#xff0c;对的&#xff0c;就是l…

jsp 页面获取action 属性的方法

1、代码法 <%ValueStack valueStack (ValueStack)request.getAttribute("struts.valueStack");String[] books (String[])valueStack.findValue("books");for(String book : books){%><tr><td>BookName:</td><td><%boo…