相信大家在实际工具中,经常需要做性能分析,做性能分析就少不了代码执行的耗时分析,以下是比较实用的耗时统计工具,我在项目中应用过,使用比较方便
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; // 取消之前的定时器
}
}
}