本文主要是介绍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时间记录器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!