【文末福利】简洁的耗时统计小工具:org.springframework.util.StopWatch

640?wx_fmt=jpeg

来源 :csdn | 作者 : boling_cavalry|原文:阅读原文

640

想知道一个代码块执行耗时多久,通常做法是执行前记录当前时间A,执行后用当前时间减去A就是耗时了。spring库中有个统计耗时的小工具:StopWatch类,它可以帮我们做这些事情,甚至做得更好,咱们直接上代码实战吧:

创建项目

我这里用的是Intellij IDEA社区版,用maven创建一个Java工程,如下图所示:

640

添加依赖

在pom.xml中添加spring core的依赖,另外,为了看到更丰富的对象信息,我们把fastjson也加入进来,如下:

<properties>
       
<spring.version>4.0.2.RELEASE</spring.version>
       
<fastjson.version>1.2.39</fastjson.version>
</properties>
   <dependencies>
       
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
           <version>${spring.version}</version>
       </dependency>
       
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>${fastjson.version}</version>
       </dependency>
   </dependencies>

模拟耗时的方法

在实际项目中,我们在调用本地方法,操作数据库,发起远程调用等场景都有可能耗时较长,所以此处做三个方法来模拟这些场景,如下,这个类的名字是StopWatchDemo:

/**
    * 延时的方法
    * @param time 延时时常,单位毫秒
    */

   private static void delay(long time){
       try{
           Thread.sleep(time);
       }catch(InterruptedException e){
           e.printStackTrace();
       }
   }

   /**
    * 假设这个方法在执行本地调用,耗时100毫秒
    */

   private void executeNative(){
       delay(100);
   }

   /**
    * 假设这个方法在执行数据库操作,耗时200毫秒
    */

   private void executeDB(){
       delay(200);
   }

   /**
    * 假设这个方法在执行远程调用,耗时300毫秒
    */

   private void executeRPC(){
       delay(300);
   }
用StopWatch类统计耗时

执行每个方法,并且统计这些方法耗时的代码如下,不多说了,看注释就好:

StopWatchDemo demo = new StopWatchDemo();

       
       StopWatch stopWatch = new StopWatch("stopwatch test");

       
       stopWatch.start("执行本地方法");
       demo.executeNative();
       stopWatch.stop();

       
       stopWatch.start("执行数据库操作");
       demo.executeDB();
       stopWatch.stop();

       
       stopWatch.start("执行远程调用");
       demo.executeRPC();
       stopWatch.stop();

       
       System.out.println(stopWatch.prettyPrint());

       System.out.println("\n");

       
       System.out.println(stopWatch.shortSummary());

       System.out.println("\n");

       
       System.out.println(JSON.toJSON(stopWatch.getTaskInfo()));

执行结果

代码的执行结果如下,可以看到prettyPrint()返回的信息是格式化好的汇总数据,包含了每段耗时以及所占整体的百分比,让人对大致情况一目了然,shortSummary()返回的是名称和总耗时,stopWatch.getTaskInfo()返回了一个数组,里面是每一段统计的名称和耗时:

00106  017%  执行本地方法
00204  033%  执行数据库操作
00302  049%  执行远程调用



StopWatch 'stopwatch test': running time (millis) = 612[{"timeSeconds":0.106,"taskName":"执行本地方法","timeMillis":106},{"timeSeconds":0.204,"taskName":"执行数据库操作","timeMillis":204},{"timeSeconds":0.302,"taskName":"执行远程调用","timeMillis":302}]
注意事项

在阅读StopWatch的源码时,发现有两点需要注意:
1. 多个耗时的分段信息是存储在LinkedList集合中的,非线程安全,而且有很多成员变量,所以不能在多线程中使用;
2. StopWatch类的作者如下图所示,Rod Johnson:Spring Framework创始人、音乐学博士~~
640

至此,简洁易用的StopWatch就介绍完毕了,希望它能在开发调试和查找问题时祝您一臂之力。

Demo工程源码可以在我的git上获取:git@github.com:zq2599/blog_demos.git
里面有多个工程,本次实战对应的工程如下图红框所示:

640

文末福利

640?wx_fmt=jpeg

内容提要

Java开发一直是当前互联网领域最火热的开发技能之一,Java工程师也一直是需求量非常大的开发职位。本书主要针对一名合格的Java工程师的必备技能做了大纲性的总结和阐述。本书内容包括了工程化、常用开发框架、数据存储、数据传输、Java编程高级知识、性能优化、安全技术等内容,基本涵盖了Java工程师需要掌握的绝大部分技能点。

Java工程师修炼之道》可以看作一本Java工程师的入职指南,也可以看作一本串联Java后端技能点的参考手册。通过精心编排的内容,刚入门的Java工程师能够体系化地学习相关开发技能,有经验的Java工程师能够查漏补缺,巩固自己的相关开发技能,进一步完善自身的Java技术体系。

目录

1章 后端技术导言

1.1后端基础设施

1.1.1请求统一入口——API网关

1.1.2业务应用和后端基础框架

1.1.3缓存、数据库、搜索引擎、消息队列

1.1.4文件存储

1.1.5统一认证中心

1.1.6单点登录系统

1.1.7统一配置中心

1.1.8服务治理框架

1.1.9统一调度中心

1.1.10统一日志服务

1.1.11数据基础设施

1.1.12故障监控

1.2 Java后端技术概览

1.2.1软件开发的核心原则

1.2.2软件开发的软件过程

1.2.3日常开发常用工具

1.2.4应用的运行环境

1.2.5常用第三方服务

1.2.6计算机基础科学知识

1.2.7数据处理相关技能

1.2.8 Java编程知识

1.2.9系统架构演化

1.2.10典型的部署架构

1.3如何学习后端技术

1.3.1扎实的计算机基础知识

1.3.2知其然更要知其所以然

1.3.3动手实践

1.3.4频繁练习

1.3.5持续学习

1.3.6自我总结

1.3.7如何学习一门新技术

1.3.8总结

2Java项目与工程化

2.1项目构建

2.1.1传统构建工具——Ant

2.1.2主流构建工具——Maven

2.1.3新兴构建工具——Gradle

2.2代码版本控制

2.2.1集中式代码版本管理——SVN

2.2.2分布式代码版本管理——Git

2.2.3提交日志的规范

2.3代码质量保证

2.3.1使用单元测试保证代码质量

2.3.2衡量单元测试的标准

2.3.3开发规范与建议

3章 开发框架

3.1依赖注入

3.1.1 JSR-330依赖注入规范

3.1.2 Guice

3.1.3 PicoContainer

3.1.4 Dagger

3.1.5 Spring Framework

3.1.6循环依赖问题

3.2对象关系映射

3.2.1表元数据的映射

3.2.2 CRUD以及属性的查询

3.2.3查询缓存的使用

3.2.4结果的映射

3.2.5规范SQL书写的语句构建器

3.2.6使用提示

3.3日志

3.3.1 JDK Logging

3.3.2 Log4j

3.3.3 Log4j2

3.3.4 Logback

3.3.5统一日志API的门面框架

3.3.6统一日志框架的使用

3.4 Web MVC

3.4.1为什么是Spring MVC

3.4.2 Spring MVC的请求处理流程

3.4.3典型的配置方式

3.4.4XML的配置方式

3.4.5MVC应用做单元测试

3.4.6验证Web请求的参数

3.4.7使用异步Servlet

3.4.8使用提示

4Spring

4.1 Spring核心组件

4.1.1 Spring的双亲上下文机制

4.1.2 Spring中的事件机制

4.1.3 Bean的初始化和销毁

4.1.4 Bean的动态构造

4.1.5注入集合、枚举、类的静态字段

4.1.6面向方面编程——AOP

4.1.7进阶XML的配置

4.1.8XML的配置方式

4.2 Spring数据操作框架

4.2.1 Spring JDBC

4.2.2 Spring Data Redis

4.2.3 Spring Data MongoDB

4.3 Spring Boot

4.3.1 Spring Boot使用示例

4.3.2 Spring Boot的运行原理

4.3.3 Spring Boot的组成模块

4.3.4小结

4.4 Spring常用组件

4.4.1表达式引擎——Spring Expression Language

4.4.2远程过程访问的支持——Spring Remoting

4.4.3 SpringJMX的集成

4.4.4定时任务的支持——Spring Quartz

4.4.5跨域请求的支持——Spring CORS

4.5总结

5章 数据存储

5.1关系型数据库——MySQL

5.1.1存储引擎

5.1.2字符集和校对规则

5.1.3索引的使用

5.1.4查询缓存的使用

5.1.5数据同步中的Binlog

5.1.6事务机制

5.1.7大表优化

5.1.8高可用支持

5.1.9使用提示

5.2非关系型数据库

5.2.1 KV数据库

5.2.2文档数据库——MongoDB

5.2.3列数据库——HBase

5.3缓存

5.3.1本地缓存

5.3.2分布式缓存——Redis

5.3.3缓存设计的典型方案

5.4搜索引擎——Elasticsearch

5.4.1开源全文检索库——Apache Lucene

5.4.2关键概念

5.4.3查询的优化

5.4.4内存的使用优化

5.4.5开源日志管理方案——ELK

6章 数据通信

6.1 RESTful架构风格

6.1.1支持的操作

6.1.2返回码

6.1.3资源概念

6.1.4数据的安全保障

6.1.5请求的限流

6.1.6超文本API

6.1.7编写文档

6.1.8 RESTful API实现

6.2远程过程调用——RPC

6.2.1 JDK自带的RPC——RMI

6.2.2 Hessian

6.2.3 Thrift

6.2.4 Dubbo

6.2.5数据的序列化机制

6.2.6使用提示

6.3消息中间件

6.3.1简单消息中间件——ActiveMQ

6.3.2通用消息中间件——RabbitMQ

6.3.3日志消息中间件——Kafka

6.3.4本地消息队列

7Java编程进阶

7.1 Java内存管理

7.1.1 JVM虚拟机内存

7.1.2垃圾回收理论

7.1.3常用垃圾回收器

7.2 Java网络编程

7.2.1常见网络I/O模型

7.2.2 Java网络编程模型

7.3 Java并发编程

7.3.1并发原理

7.3.2并发思路

7.3.3并发工具

7.3.4并发编程建议

7.4 Java开发利器

7.4.1 Apache工具库——Apache Commons

7.4.2 Google工具库——Guava

7.4.3最好用的时间库——Joda Time

7.4.4高效JSON处理库——FastJson

7.4.5高效Bean映射框架——Orika

7.5 Java新版本的特性

7.5.1 Java 7

7.5.2 Java 8

7.5.3 Java 9

7.6总结

8章 性能调优

8.1调优准备

8.1.1 HotSpot虚拟机体系结构

8.1.2操作系统的性能调优

8.1.3系统常用诊断工具

8.1.4 JDK常用诊断工具

8.2性能分析

8.2.1 CPU分析

8.2.2内存分析

8.2.3 I/O分析

8.2.4其他分析工具

8.3性能调优

8.3.1 CPU调优

8.3.2内存调优

8.3.3 I/O调优

8.3.4其他优化建议

8.3.5 JVM参数配置

8.3.6 JVM性能增强

9章 安全技术

9.1 Java加密

9.1.1单向加密算法

9.1.2对称加密算法

9.1.3非对称加密算法

9.2安全HTTP——HTTPS

9.2.1安全协议——SSL/TLS

9.2.2证书中心——CA

9.2.3请求交互过程

9.2.4性能优化

9.3 Web安全

9.3.1跨站点脚本攻击

9.3.2跨站点请求伪造

9.3.3 SQL注入攻击

9.3.4基于约束条件的SQL攻击

9.3.5分布式拒绝服务攻击——DDOS

9.3.6会话固定攻击——Session fixation

附录A 代码构建常用命令

附录B Git常用命令

附录C MySQL常用命令

附录D MongoDB常用命令

附录E Java调优常用命令

支持作者直接购买

640?wx_fmt=png

赠书说明:

  1. 活动对象:公众号读者

  2. 抽奖规则,长按小程序抽奖二维码参与即可

  3. 中奖后在抽奖小程序填写好收货信息

  4. 周一到周五都有抽书活动,每日书籍不一样,敬请期待

    胖友,分享一波可好


640?wx_fmt=png

640?wx_fmt=png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值