模拟StopWatch改写的一款耗时调试工具

2024-01-19 23:12

本文主要是介绍模拟StopWatch改写的一款耗时调试工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

StopWatch在单个文件的单个方法中确时还蛮好用的,但跨多个文件,多个方法的同一线程内调试就有明显的不舒服。一是要建立ThreadLocal共享StopWatch的实例。二是StopWatch的start和stop必须形成闭合。在方法嵌套的场景。比如要查看大方法执行时间,还要查看大方法里面的某个调用的执行时间。这就没法做到了。3就是StopWatch以纳秒为单位,阅读不舒服(非高并发网站,没那么高的要求,毫秒即可),因此,做了这款调试工作。只记录线程某些栈节点的抵达时间。形成一个时间轴。最后打印这个时间轴的相邻时间差即可。调试中,只要确定费时的代码在哪个小区间,一般有经验的话能很快定位到问题代码。
效果如下图:

在这里插入图片描述
代码实现:
有需要的可以拿去美化下

public class RunnerAnalyzer {private final static ThreadLocal<List<RunnerInfo>> CONTAINER = new ThreadLocal<>();public static void start(String nodeName) {List<RunnerInfo> runnerInfos = CONTAINER.get();if (null == runnerInfos) {CONTAINER.set(new ArrayList<>());}List<RunnerInfo> container = CONTAINER.get();container.add(new RunnerInfo(nodeName));CONTAINER.set(container);}public static void clear() {CONTAINER.remove();}public static void prettyPrint(long moreThanTime) {RunnerAnalyzer.start("耗时记录结束");List<RunnerInfo> runnerInfos = CONTAINER.get();if (null == runnerInfos) {clear();return;}int size = runnerInfos.size();int lastIndex = size - 1;RunnerInfo first = runnerInfos.get(0);RunnerInfo last = runnerInfos.get(lastIndex);long totalTime = last.getTime() - first.getTime();// 只打印超过某一时间的,免得压力测试的时候疯狂刷if (totalTime < moreThanTime) {clear();return;}StringBuilder sb = new StringBuilder();sb.append("---------------------------------------------\n");String totalMessage = "总耗时" + totalTime + "\n";sb.append(totalMessage);String title = "抵达时间                    耗时       占比         节点名称\n";sb.append(title);for (int i = 0; i < size; i++) {RunnerInfo runnerInfo = runnerInfos.get(i);String showTimeName = runnerInfo.getShowTime() + "    ";sb.append(showTimeName);if (i != 0) {RunnerInfo lastNode = runnerInfos.get(i - 1);long lastNodeTime = lastNode.getTime();long during = runnerInfo.getTime() - lastNodeTime;String duringStr = during + "    ";sb.append(duringStr);String rate = ZYNumberUtils.rate(during, totalTime) + "    ";sb.append(rate);} else {sb.append("0    ");sb.append("    ");}String nodeName = runnerInfo.getNodeName() + "\n";sb.append(nodeName);}sb.append("---------------------------------------------\n");System.out.println(sb.toString());clear();}
}
public class RunnerInfo {private String nodeName;private long time;private String showTime;public RunnerInfo(String nodeName) {this.nodeName = nodeName;Date date = new Date();this.time = date.getTime();this.showTime = ZYDateUtils.formart(date, "yyyy-MM-dd HH:mm:ss:SSS");}
}

这篇关于模拟StopWatch改写的一款耗时调试工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624025

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1