java 或 安卓项目中耗时统计工具类

相信大家在实际工具中,经常需要做性能分析,做性能分析就少不了代码执行的耗时分析,以下是比较实用的耗时统计工具,我在项目中应用过,使用比较方便

java 复制代码
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 描述:
 * 创建者: IT乐手
 * 日期: 2025/7/31
 */
public class TimeMonitor {
    private static final HashMap<String, Long> startTimeMap = new HashMap<>();
    private static final StringBuilder stringBuilder = new StringBuilder();
    private static final AtomicInteger taskCounter = new AtomicInteger(0);
    private static Timer timer = null;
    /**
     * 开始统计某个任务的耗时
     * @param taskName 任务名(可区分不同统计点)
     */
    public static void start(String taskName) {
        AtotoLogger.i("TimeMonitor", "Start monitoring task: " + taskName);
        checkTimeout();
        startTimeMap.put(taskName, System.currentTimeMillis());
    }

    /**
     * 结束统计,并返回耗时(毫秒)
     * @param taskName 任务名
     * @param isLast 最后的任务
     * @return 耗时(ms),如未调用 start 返回-1
     */
    public static void end(String taskName, boolean isLast) {
        AtotoLogger.i("TimeMonitor", "End monitoring task: " + taskName + ", isLast: " + isLast);
        checkTimeout();
        Map<String, Long> map = startTimeMap;
        Long startTime = map.get(taskName);
        if (startTime == null) {
            return;
        }
        long duration = System.currentTimeMillis() - startTime;
        map.remove(taskName); // 防止内存泄漏

        // 统计任务数量
        int taskCount = taskCounter.incrementAndGet();
        // 输出日志
        stringBuilder.append(taskCount).append(".")
                     .append(taskName)
                     .append(", 耗时: ")
                     .append(duration)
                     .append(" ms\n");
        if (isLast) {
            AtotoLogger.i("TimeMonitor", stringBuilder.toString());
            stringBuilder.setLength(0); // 清空 StringBuilder
            taskCounter.set(0); // 重置任务计数器
        } else {
            AtotoLogger.i("TimeMonitor", taskCount + ". " + taskName + ", 耗时: " + duration + " ms");
        }
    }


    public static void end(String taskName) {
        end(taskName, false);
    }

    private static void checkTimeout() {
        if (timer != null) {
            timer.cancel();
            timer = null; // 取消之前的定时器
        }
        timer = new Timer("TimeMonitorTimer");
        timer.schedule(
                new java.util.TimerTask() {
                    @Override
                    public void run() {
                        clear();
                        // 这里可以添加定时任务的逻辑
                    }
                }, 10000); // 每10秒执行一次
    }
    /**
     * 清理该线程下的所有统计数据
     */
    public static void clear() {
        AtotoLogger.i("TimeMonitor", stringBuilder.toString());
        stringBuilder.setLength(0); // 清空 StringBuilder
        startTimeMap.clear();
        if (timer != null) {
            timer.cancel();
            timer = null; // 取消之前的定时器
        }
    }
}
相关推荐
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
于慨1 天前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg3213211 天前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald1 天前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川1 天前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
BoomHe1 天前
Android AOSP13 原生 Launcher3 壁纸获取方式
android
殷紫川1 天前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo1 天前
查看 Tomcat 的堆内存参数
java·tomcat