TimeLogUtils JAVA时间记录器

2024-04-19 09:48

本文主要是介绍TimeLogUtils JAVA时间记录器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记得曾经写过一遍《StopWatch 时间记录器》的文章,介绍了如何利用StopWatch来方便的记录每次操作消耗的时间,后来博主在学习其他东西的时候也想用一下这个简单的时间记录器,然而我所实践的项目并不是springframework框架,无法使用StopWatch,所以干脆自己写了一个时间记录器,收录到自己的工具包中。下面是API:

方法名注释
public static void mark()在当前位置进行标记,用于下次统计
public static String lastConsumingMillis()

打印当前时间到上次标记的耗时,单位毫秒

public static String totalConsumingMillis() 打印当前时间到第一次标记的总耗时,单位豪秒
public static String smartConsumingMillis()打印当前时间到第一次标记的各个标记处的耗时,单位豪秒
public static String lastConsumingSeconds()打印当前时间到上次标记的耗时,单位秒
public static String totalConsumingSeconds() 打印当前时间到第一次标记的总耗时,单位秒
public static String smartConsumingSeconds() 打印当前时间到第一次标记的各个标记处的耗时,单位秒
public static void mark(String mark)在当前位置进行标记,用于下次统计。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。
public static String lastConsumingMillis(String mark)

打印当前时间到上次标记的耗时,单位毫秒。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。

public static String totalConsumingMillis(String mark) 打印当前时间到第一次标记的总耗时,单位豪秒。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。
public static String smartConsumingMillis(String mark)打印当前时间到第一次标记的各个标记处的耗时,单位豪秒。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。
public static String lastConsumingSeconds(String mark)打印当前时间到上次标记的耗时,单位秒。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。
public static String totalConsumingSeconds(String mark) 打印当前时间到第一次标记的总耗时,单位秒。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。
public static String smartConsumingSeconds(String mark) 打印当前时间到第一次标记的各个标记处的耗时,单位秒。mark为标记的名称,一个mark可以产生一系列标记,各个mark之间互不影响。
public static void clear()清除不带mark的所有标记,如果忘记清理,线程结束时会自动清理。
public static void clear(String mark) 清除一个mark的所有标记,如果忘记清理,线程结束时会自动清理。
public static void clearAll()清除所有标记,如果忘记清理,线程结束时会自动清理。

用法:

        public static void main(String[] args) throws Exception {//简要标记TimeLogUtils.mark();//标记tempTimeLogUtils.mark("temp");Thread.sleep(200L);System.out.println(TimeLogUtils.lastConsumingMillis());TimeLogUtils.mark();Thread.sleep(2000L);TimeLogUtils.mark("temp");TimeLogUtils.mark();Thread.sleep(2000L);System.out.println(TimeLogUtils.totalConsumingMillis());System.out.println(TimeLogUtils.smartConsumingMillis());System.out.println("\n\n");System.out.println(TimeLogUtils.lastConsumingSeconds());System.out.println(TimeLogUtils.totalConsumingSeconds());System.out.println(TimeLogUtils.smartConsumingSeconds());System.out.println("\n\n");System.out.println(TimeLogUtils.lastConsumingMillis("temp"));System.out.println(TimeLogUtils.totalConsumingMillis("temp"));System.out.println(TimeLogUtils.smartConsumingMillis("temp"));System.out.println("\n\n");System.out.println(TimeLogUtils.lastConsumingSeconds("temp"));System.out.println(TimeLogUtils.totalConsumingSeconds("temp"));System.out.println(TimeLogUtils.smartConsumingSeconds("temp"));//如果只清理不带参的标记TimeLogUtils.clear();//清理带参标记TimeLogUtils.clear("temp");//清理所有标记TimeLogUtils.clearAll();}
控制台:距离上次标记耗时------200毫秒
总耗时------4222毫秒
耗时统计:
第 1 次耗时------222豪秒
第 2 次耗时------2000豪秒
第 3 次耗时------2000豪秒
总耗时------4222毫秒距离上次标记耗时------2秒
总耗时------4秒
耗时统计:
第 1 次耗时------0秒
第 2 次耗时------2秒
第 3 次耗时------2秒
总耗时------4秒距离上次标记耗时---temp---2001毫秒
总耗时---temp---2001毫秒
temp耗时统计:
第 1 次耗时------2222豪秒
第 2 次耗时------2001豪秒
总耗时---temp---2001毫秒距离上次标记耗时---temp---2秒
总耗时---temp---2秒
temp耗时统计:
第 1 次耗时------2秒
第 2 次耗时------2秒
总耗时---temp---2秒Process finished with exit code 0

源码:

/** Copyright (c) 2019. 唐江华 保留所有权。*/package com.io.filter;import java.util.*;/*** @author tangjianghua* @data @data*/
public class TimeLogUtils {private static final String logFormatMillis = "距离上次标记耗时---%s---%s毫秒";private static final String logFormatMillisTotal = "总耗时---%s---%s毫秒";private static final String logFormatSeconds = "距离上次标记耗时---%s---%s秒";private static final String logFormatSecondsTotal = "总耗时---%s---%s秒";private final static ThreadLocal<Map<String, TimeNode>> THREAD_LOCAL = new ThreadLocal<>();private static Map<String, TimeNode> get() {Map<String, TimeNode> map = THREAD_LOCAL.get();if (map == null) {map = new HashMap<>();THREAD_LOCAL.set(map);}return map;}/*** 标记一个任务,不同任务之间互不影响。** @param mark*/public static void mark(String mark) {if (mark == null) {throw new NullPointerException("mark can not be null.");}mark1(mark);}/*** 默认标记*/public static void mark() {mark1(null);}/*** 清理所有的时间记录副本*/public static void clearAll() {THREAD_LOCAL.set(null);}/*** 清理mark的时间记录副本** @param mark*/public static void clear(String mark) {if (mark == null) {throw new NullPointerException("mark can not be null.");}clear1(mark);}/*** 清理默认的时间记录副本*/public static void clear() {clear1(null);}/*** 清理mark的时间记录副本** @param mark*/private static void clear1(String mark) {Map<String, TimeNode> map = THREAD_LOCAL.get();if (map == null) {return;}map.remove(mark);}private static void mark1(String mark) {Map<String, TimeNode> map = get();TimeNode timeNode = map.get(mark);if (timeNode == null) {map.put(mark, new TimeNode(System.currentTimeMillis()));} else {map.put(mark, new TimeNode(timeNode, System.currentTimeMillis()));}}/*** 计算距离上次mark标记消耗的时间 单位:毫秒** @param mark* @return*/private static long lastConsumingMillis1(String mark) {Map<String, TimeNode> map = get();TimeNode timeNode = map.get(mark);if (timeNode == null) {throw new NoSuchElementException("no mark " + mark + " was logged.");}return System.currentTimeMillis() - timeNode.millis;}/*** 总耗时 单位:毫秒** @param mark* @return*/private static long totalConsumingMillis1(String mark) {TimeNode timeNode = get().get(mark);if (timeNode == null) {throw new NoSuchElementException("no mark " + mark + " was logged.");}return System.currentTimeMillis() - timeNode.first.millis;}/*** 计算距离上次mark标记消耗的时间,同时标记mark 单位:毫秒** @param mark* @return*/public static String lastConsumingMillis(String mark) {if (mark == null) {throw new NullPointerException("mark can not be null.");}return String.format(logFormatMillis, mark, lastConsumingMillis1(mark));}/*** 计算距离上次mark标记消耗的时间,同时标记mark 单位:秒** @param mark* @return*/public static String lastConsumingSeconds(String mark) {if (mark == null) {throw new NullPointerException("mark can not be null.");}return String.format(logFormatSeconds, mark, lastConsumingMillis1(mark) / 1000);}/*** mark总耗时 单位:秒** @param mark* @return*/public static String totalConsumingMillis(String mark) {if (mark == null) {throw new NullPointerException("mark can not be null.");}return String.format(logFormatMillisTotal, mark, lastConsumingMillis1(mark));}/*** mark总耗时 单位:秒** @param mark* @return*/public static String totalConsumingSeconds(String mark) {if (mark == null) {throw new NullPointerException("mark can not be null.");}return String.format(logFormatSecondsTotal, mark, lastConsumingMillis1(mark) / 1000);}/*** 计算距离上次mark标记消耗的时间,同时标记 单位:毫秒** @return*/public static String lastConsumingMillis() {return String.format(logFormatMillis, "", lastConsumingMillis1(null));}/*** 计算距离上次mark标记消耗的时间,同时标记 单位:秒** @return*/public static String lastConsumingSeconds() {return String.format(logFormatSeconds, "", lastConsumingMillis1(null) / 1000);}/*** 默认总耗时 单位:豪秒** @return*/public static String totalConsumingMillis() {return String.format(logFormatMillisTotal, "", totalConsumingMillis1(null));}/*** 默认总耗时 单位:秒** @return*/public static String totalConsumingSeconds() {return String.format(logFormatSecondsTotal, "", totalConsumingMillis1(null) / 1000);}/*** 统计默认的所有阶段的耗时** @return*/public static String smartConsumingMillis() {StringBuilder stringBuilder = new StringBuilder();TimeNode timeNode = get().get(null);if (timeNode == null) {return "未记录";}stringBuilder.append("耗时统计:\n");List<Long> longs = smartConsumingMillils1(timeNode);for (int i = longs.size() - 1; i >= 0; i--) {stringBuilder.append("第 ").append(longs.size() - i).append(" 次耗时------").append(longs.get(i)).append("豪秒\n");}return stringBuilder.append(totalConsumingMillis()).toString();}/*** 统计默认的所有阶段的耗时** @return*/public static String smartConsumingSeconds() {StringBuilder stringBuilder = new StringBuilder();TimeNode timeNode = get().get(null);if (timeNode == null) {return "未记录";}stringBuilder.append("耗时统计:\n");List<Long> longs = smartConsumingMillils1(timeNode);for (int i = longs.size() - 1; i >= 0; i--) {stringBuilder.append("第 ").append(longs.size() - i).append(" 次耗时------").append(longs.get(i) / 1000).append("秒\n");}return stringBuilder.append(totalConsumingSeconds()).toString();}/*** 统计默认的所有阶段的耗时** @return*/public static String smartConsumingMillis(String mark) {StringBuilder stringBuilder = new StringBuilder();TimeNode timeNode = get().get(mark);if (timeNode == null) {return "未记录";}stringBuilder.append(mark).append("耗时统计:\n");List<Long> longs = smartConsumingMillils1(timeNode);for (int i = longs.size() - 1; i >= 0; i--) {stringBuilder.append("第 ").append(longs.size() - i).append(" 次耗时------").append(longs.get(i)).append("豪秒\n");}return stringBuilder.append(totalConsumingMillis(mark)).toString();}/*** 统计默认的所有阶段的耗时** @return*/public static String smartConsumingSeconds(String mark) {StringBuilder stringBuilder = new StringBuilder();TimeNode timeNode = get().get(mark);if (timeNode == null) {return "未记录";}stringBuilder.append(mark).append("耗时统计:\n");List<Long> longs = smartConsumingMillils1(timeNode);for (int i = longs.size() - 1; i >= 0; i--) {stringBuilder.append("第 ").append(longs.size() - i).append(" 次耗时------").append(longs.get(i) / 1000).append("秒\n");}return stringBuilder.append(totalConsumingSeconds(mark)).toString();}/*** 将每次的耗时统计到集合里** @param timeNode* @return*/private static List<Long> smartConsumingMillils1(TimeNode timeNode) {List<Long> times = new ArrayList<>();times.add(System.currentTimeMillis() - timeNode.millis);TimeNode temp;while ((temp = timeNode.last) != null) {times.add(timeNode.millis - temp.millis);timeNode = temp;}return times;}private static final class TimeNode {/*** 上个节点*/private final TimeNode last;/*** 当前时间,毫秒*/private final long millis;/*** 队列首节点*/private final TimeNode first;public TimeNode(TimeNode last, long millis) {this.last = last;this.millis = millis;if (last == null) {first = this;} else {first = last.first;}}public TimeNode(long millis) {this(null, millis);}}}

工具包git地址:https://github.com/tang-jianghua/common-utils

这篇关于TimeLogUtils JAVA时间记录器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@