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

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.