StopWatch的使用
org.springframework.util.StopWatch 是 Spring 框架提供的一个轻量级的计时工具,用于测量代码执行时间。它比 Apache Commons Lang 的 StopWatch 提供了更多的功能,例如累计多个时间段、打印详细报告等。
以下是如何使用 Spring 的 StopWatch:
1. 创建 StopWatch 实例
首先,创建一个 StopWatch 对象:
import org.springframework.util.StopWatch;StopWatch stopWatch = new StopWatch();
2. 启动计时
在执行任务之前,调用 start() 方法来开始计时:
stopWatch.start("任务描述");
你可以给每个计时任务指定一个任务名,这有助于在输出报告时区分不同的任务。
3. 执行任务
执行你想要测量的任务:
// 执行一些操作
performTask();
4. 停止计时
任务完成后,调用 stop() 方法来停止计时:
stopWatch.stop();
5. 获取结果
调用 getLastTaskTimeMillis() 方法来获取最后一次任务的执行时间(毫秒):
long lastTaskTime = stopWatch.getLastTaskTimeMillis();
System.out.println("Last task time: " + lastTaskTime + " ms");
6. 打印详细报告
使用 print() 方法打印 StopWatch 的详细报告:
stopWatch.print();
这将输出所有任务的名称、开始时间、持续时间等信息。
7. 重置 StopWatch
如果你想重新开始测量,可以调用 reset() 方法:
stopWatch.reset();
示例代码
import org.springframework.util.StopWatch;public class StopWatchExample {public static void main(String[] args) {StopWatch stopWatch = new StopWatch();stopWatch.start("Task1");// 执行 Task1performTask1();stopWatch.stop();stopWatch.start("Task2");// 执行 Task2performTask2();stopWatch.stop();// 打印详细报告stopWatch.print();// 重置 StopWatchstopWatch.reset();}private static void performTask1() {// 模拟耗时任务try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}private static void performTask2() {// 模拟另一个耗时任务try {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}
注意事项
StopWatch是线程安全的,但每个StopWatch实例只能用于测量一个时间段。- 使用
stop()方法后,你可以再次调用start()方法来测量新的时间段,而不需要创建新的StopWatch实例。 print()方法默认使用System.out打印报告,你也可以传递一个PrintWriter或PrintStream到print()方法来指定输出目标。
Spring 的 StopWatch 是一个非常有用的工具,特别是在性能调优和基准测试中。
Spring 的 StopWatch 类提供了一些高级用法和功能,可以帮助你更细致地进行性能分析。以下是一些其他用法:
分阶段计时(Task Timing)
你可以对多个阶段或任务进行计时,这在测量整个流程中的各个部分的性能时非常有用:
StopWatch stopWatch = new StopWatch();
stopWatch.start("阶段1");
// 阶段1的代码
stopWatch.stop();stopWatch.start("阶段2");
// 阶段2的代码
stopWatch.stop();// 打印每个阶段的用时
System.out.println("阶段1用时:" + stopWatch.getLastTaskInfo().getTimeTaken() + "毫秒");
System.out.println("阶段2用时:" + stopWatch.getLastTaskInfo().getTimeTaken() + "毫秒");
累计计时(Cumulative Timing)
StopWatch 允许你多次调用 start() 和 stop(),它会累积计时结果:
StopWatch stopWatch = new StopWatch();
// 假设执行多个循环或重复任务
for (int i = 0; i < 5; i++) {stopWatch.start("循环" + i);// 循环任务的代码performTask();stopWatch.stop();
}
// 打印总用时
System.out.println("总用时:" + stopWatch.getTotalTimeMillis() + "毫秒");
格式化输出(Formatted Output)
StopWatch 的 prettyPrint() 方法提供了一种格式化的输出方式,使得输出结果更加易于阅读:
stopWatch.prettyPrint();
// 或者指定输出目的地
stopWatch.prettyPrint(System.out);
获取详细信息(Detailed Information)
你可以获取有关每个任务的详细信息,例如开始时间、结束时间、持续时间等:
StopWatch.TaskInfo taskInfo = stopWatch.getLastTaskInfo();
System.out.println("任务名称:" + taskInfo.getTaskName());
System.out.println("开始时间:" + taskInfo.getStartTime());
System.out.println("持续时间:" + taskInfo.getTimeTaken() + "毫秒");
异常处理(Exception Timing)
你可以测量抛出异常的任务的执行时间:
try {stopWatch.start("可能抛出异常的任务");// 可能抛出异常的代码stopWatch.stop();
} catch (Exception e) {System.out.println("任务失败,用时:" + stopWatch.getLastTaskTimeMillis());
}
嵌套计时(Nested Timing)
StopWatch 支持嵌套计时,这意味着你可以在另一个任务计时的内部开始和停止计时:
stopWatch.start("外部任务");
try {stopWatch.start("内部任务");// 内部任务的代码stopWatch.stop();
} finally {stopWatch.stop("外部任务");
}
配置输出(Customizing Output)
你可以自定义 StopWatch 的输出格式,通过传递自定义的 PrintWriter 或 PrintStream 到 print() 或 prettyPrint() 方法:
PrintWriter writer = new PrintWriter(new StringWriter());
stopWatch.prettyPrint(writer);
System.out.println(writer.toString());
测量代码块的执行时间(Measuring Code Block)
你可以测量任意代码块的执行时间,而不需要在代码块内部手动调用 start() 和 stop():
StopWatch stopWatch = new StopWatch();
stopWatch.start("代码块任务");
long time = stopWatch.lastTaskTimeMillis();
System.out.println("代码块执行前用时:" + time + "毫秒");// 执行代码块
performTask();stopWatch.stop();
System.out.println("代码块执行后用时:" + stopWatch.getLastTaskTimeMillis() + "毫秒");
使用这些高级用法,StopWatch 成为了一个功能强大的工具,可以帮助你深入理解应用程序的性能特性。
相关文章:
StopWatch的使用
org.springframework.util.StopWatch 是 Spring 框架提供的一个轻量级的计时工具,用于测量代码执行时间。它比 Apache Commons Lang 的 StopWatch 提供了更多的功能,例如累计多个时间段、打印详细报告等。 以下是如何使用 Spring 的 StopWatchÿ…...
MySQL基础篇(三)数据库的修改 删除 备份恢复 查看连接情况
对数据库的修改主要指的是修改数据库的字符集,校验规则。 将test1数据库字符集改为gbk。 数据库的删除: 执行完该数据库就不存在了,对应数据库文件夹被删除,级联删除,里面的数据表全部被删除。 注意:不要随…...
android手机电视相框项目-学员做出个bug版本邀请大家review提意见
背景 前几天给我的vip学员布置了一个android手机/电视相框的项目,具体详情看如下链接: https://mp.weixin.qq.com/s/l2roDoco-o59SLlORENZlA 这个项目我说过不给提供答案哈,让各位学员朋友自己独立思考完成哈,因为尽量想让大家慢…...
web零碎知识2
不知道我的这个axios的包导进去没。 找一下关键词: http请求协议:就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行,第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…...
Android项目框架
Android项目基于Android Studio开发,Android Studio使用Gradle作为项目构建工具。新建工程后可以看到如图所示目录结构,将Android切成Project可以看到完整的Android工程目录结构,如图所示。 图1-2 Android项目目录结构 app目录是一个典型的…...
vue 模糊查询加个禁止属性
vue 模糊查询加个禁止属性 父组件通过属性传,是否禁止输入-------默认可以输入...
MySQL 主从复制中 MHA 工具的研究与实践
MySQL 主从复制中 MHA 工具的研究与实践 一、MHA 工具简介二、MHA 的工作原理三、MHA 配置步骤环境准备1. 在主服务器上配置主从复制2. 在从服务器上配置复制 安装 MHA 工具1. 安装必要的依赖包2. 下载并安装 MHA 配置 MHA1. 创建 MHA 配置文件2. 配置 SSH 免密登录 测试 MHA1.…...
Hi3861 OpenHarmony嵌入式应用入门--TCP Server
本篇使用的是lwip编写tcp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点,并且密码为PARAM_HOTSPOT_PSK LwIP简介 LwIP是什么? A Lightweight TCP/IP stack 一个轻量级的TCP/IP协议栈 详细介绍请参考LwIP项目官网:lwIP - A Li…...
Poker Game, Run Fast
Poker Game, Run Fast 扑克:跑得快 分门别类: 单张从小到大默认 A < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K 跑得快:单张从小到大 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 &…...
订单折扣金额分摊算法|代金券分摊|收银系统|积分分摊|分摊|精度问题|按比例分配|钱分摊|钱分配
一个金额分摊的算法,将折扣分摊按比例(细单实收在总体的占比)到各个细单中。 此算法需要达到以下要求: 折扣金额接近细单总额,甚至折扣金额等于细单金额,某些时候甚至超过细单总额,要保证实收不…...
Matlab中collectPlaneWave函数的应用
查看文档如下: 可以看出最多5个参数,分别是阵列对象,信号幅度,入射角度,信号频率,光速。 在下面的代码中,我们先创建一个3阵元的阵列,位置为:(-1,0,0&#x…...
Linux系统的基础知识和常用命令
1、什么是Linux? 是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行…...
三相异步电动机的起动方法
1. 引言 2. 三相笼型异步电动机德起动方法 3. 三相绕线型异步电动机的起动方法 4. 软起动器起动 5. 参考文献 1 引言 三相异步电动机结构简单﹑价格低廉﹑运行可靠﹑维护方便,在工农业生产中得到了广泛应用。为使电动机能够转动起来,并很快达到工作转…...
【LinuxC语言】手撕Http协议之accept_request函数实现(一)
文章目录 前言accept_request函数作用accept_request实现解析方法根据不同方法进行不同操作http服务器响应格式unimplemented函数实现总结前言 在计算机网络中,HTTP协议是一种常见的应用层协议,它定义了客户端和服务器之间如何进行数据交换。在这篇文章中,我们将深入探讨Li…...
Redis Cluster 模式 的具体实施细节是什么样的?
概述 参考:What are Redis Cluster and How to setup Redis Cluster locally ? | by Rajat Pachauri | Medium Redis Cluster 的工作原理是将数据分布在多个节点上,同时确保高可用性和容错能力。以下是 Redis Cluster 运行方式的简要概述: …...
基于大模型的机器人控制
基于大模型的机器人控制是指利用深度学习中的大型神经网络模型来实现对机器人的精确控制。这种方法结合了深度学习的强大表征学习能力和机器人控制的实际需求,旨在提高机器人的自主性、灵活性和智能性。 基本原理 数据收集:首先,需要收集大量…...
在 PostgreSQL 中,如何处理数据的版本控制?
文章目录 一、使用时间戳字段进行版本控制二、使用版本号字段进行版本控制三、使用历史表进行版本控制四、使用 RETURNING 子句获取更新前后的版本五、使用数据库触发器进行版本控制 在 PostgreSQL 中,处理数据的版本控制可以通过多种方式实现,每种方式都…...
Rust 组织管理
Rust 组织管理 Rust 是一种系统编程语言,以其内存安全性、速度和并发性而闻名。它由 Mozilla 开发,并得到了一个庞大而活跃的社区的支持。Rust 的组织管理涉及多个方面,包括项目管理、社区参与、工具和库的维护,以及生态系统的整…...
vb.netcad二开自学笔记1:万里长征第一步Hello CAD!
已入门的朋友请绕行! 今天开启自学vb.net 开发autocad,网上相关资料太少了、太老了。花钱买课吧,穷!又舍不得,咬牙从小白开始摸索自学吧,虽然注定是踏上了一条艰苦之路,顺便作个自学笔记备忘!积…...
Vue的学习之数据与方法
前段期间,由于入职原因没有学习,现在已经正式入职啦,接下来继续加油学习。 一、数据与方法 文字备注已经在代码中,方便自己学习和理解 <!DOCTYPE html> <html><head><meta charset"utf-8">&l…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
SQLSERVER-DB操作记录
在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...
