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

相关文章

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再