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; // 取消之前的定时器
        }
    }
}
相关推荐
峥嵘life1 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
M-Robots echo1 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~2 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
Kapaseker2 小时前
破坏性更新 - 解读 Jetpack Compose 1.12
android·kotlin
雨白3 小时前
我的 UML 学习笔记:结合 Android 实例看懂 4 种常用图表
android·架构
mldong3 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
怣疯knight3 小时前
快速判断apk有没有支持16kb页面标准
android
风流 少年4 小时前
Spring AI 2.0:Advisor
android·人工智能·spring
mqiqe4 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一514 小时前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依