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; // 取消之前的定时器
        }
    }
}
相关推荐
光头闪亮亮1 小时前
Fyne ( go跨平台GUI )项目实战-项目开发必备基础知识(中)
android·c++·go
光头闪亮亮1 小时前
Fyne ( go跨平台GUI )项目实战-项目开发必备基础知识(上)
android·sqlite·go
光头闪亮亮1 小时前
Fyne ( go跨平台GUI )项目实战-项目开发必备基础知识(下)
android·c++·go
captain3761 小时前
多线程线程安全问题
java·java-ee
CoderYanger2 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
灵极海2 小时前
LangChain4j RAG 实战完整指南:从入门到踩坑
java·langchain
yaoxin5211232 小时前
476. Java 反射 - 调用方法
java·开发语言
Ch_champion2 小时前
2018年之前的Android 项目上使用的技术点(及第三方库)
android
龚礼鹏2 小时前
RK Android16 wifi 投屏失败问题排查
android
Ivanqhz3 小时前
Rust Lazy浅析
java·javascript·rust