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; // 取消之前的定时器
        }
    }
}
相关推荐
悠仁さん5 分钟前
【C++】set map 使用
java·前端·c++
用户60709759149069 分钟前
AOSP 14 OTA 升级指导(三):三条升级链路——Java API、自研 HAL 与 TR069
android
yuniko-n31 分钟前
【JUC】Thread 内存泄露
java
freejackman32 分钟前
【架构篇】双遍历 + 多栈协同:手撸 SQL 血缘引擎的架构思考
java·大数据·数据库·hive·sql·架构·spark
企业数字化笔记39 分钟前
业务单据怎样接入流程中心?启动条件、实例关联与失败回退
java·spring boot·mysql
挖掘狂人1 小时前
同一个端口能不能被两个程序同时监听?
java·后端·程序员
codigger1 小时前
同一个端口能不能被两个程序同时监听?
java·后端·程序员·编程
西索斯coding1 小时前
qwen3.8-max-0902 和 minimax-m3 改真实仓库差多少?2026 年 50 个缺陷复现实测框架
java·服务器·网络·ai
2501_933923251 小时前
SpringCloud:OpenFeign快速实现
java·后端·spring cloud·openfeign
denlaku1 小时前
JDK 26 新特性详解
java