您好,登录后才能下订单哦!
# 如何知道整个系统每个方法的执行时间
## 引言
在软件开发过程中,性能优化是永恒的话题。当系统出现性能瓶颈时,开发人员需要快速定位到耗时较长的代码段。了解每个方法的执行时间是性能调优的基础工作之一。本文将详细介绍多种获取方法执行时间的方案,涵盖日志埋点、AOP、APM工具、字节码增强等主流技术,并分析各自的优缺点和适用场景。
---
## 一、基础方案:手动埋点计时
### 1.1 核心实现原理
```java
long start = System.currentTimeMillis();
try {
// 业务代码
} finally {
long cost = System.currentTimeMillis() - start;
System.out.println("methodA executed in " + cost + "ms");
}
优点: - 实现简单,无需引入第三方依赖 - 可精确控制需要监控的代码段
缺点: - 代码侵入性强,需要修改每个方法 - 大量重复代码难以维护 - 输出分散,需要额外收集分析
@Aspect
@Component
public class TimeMonitorAspect {
@Around("execution(* com.yourpackage..*.*(..))")
public Object monitor(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
try {
return pjp.proceed();
} finally {
System.out.println(pjp.getSignature() + " cost: " +
(System.currentTimeMillis() - start) + "ms");
}
}
}
切入点表达式配置
* com.yourpackage..*.*(..)
监控指定包下所有方法性能数据输出方式
优势: - 非侵入式实现 - 集中化管理监控逻辑 - 支持动态开关
局限性: - 无法监控非Spring管理的对象 - 对private方法无效 - 存在代理开销(约5-15%性能损耗)
工具名称 | 公司 | 核心特性 | 开源协议 |
---|---|---|---|
SkyWalking | Apache | 分布式追踪、JVM监控 | Apache 2.0 |
Pinpoint | Naver | 全自动探针、调用拓扑 | Apache 2.0 |
Arthas | Alibaba | 运行时诊断、热修复 | GPLv3 |
# docker-compose.yml 配置片段
skywalking-oap:
image: apache/skywalking-oap-server:9.4.0
ports:
- "11800:11800"
- "12800:12800"
skywalking-ui:
image: apache/skywalking-ui:9.4.0
ports:
- "8080:8080"
# 启动记录
jcmd <pid> JFR.start duration=60s filename=recording.jfr
# 分析结果
jfr print --events jdk.ExecutionSample recording.jfr
事件类型 | 说明 |
---|---|
jdk.ExecutionSample | 方法执行采样 |
jdk.CPULoad | CPU使用情况 |
jdk.GCHeapSummary | 堆内存统计 |
public class TimingAgent {
public static void premain(String args, Instrumentation inst) {
inst.addTransformer(new TimingTransformer());
}
}
class TimingTransformer implements ClassFileTransformer {
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) {
// 使用ASM修改字节码
}
}
操作类型 | 额外耗时 |
---|---|
方法进入记录 | 50-100ns |
上下文保存 | 200-500ns |
异步上报 | 1-5ms(网络) |
推荐Grafana看板配置:
SELECT
method_name,
avg(duration)
FROM method_metrics
WHERE time > now() - 1h
GROUP BY method_name
ORDER BY avg DESC
LIMIT 20
获取方法执行时间有多种技术路线,建议根据实际场景选择: - 开发阶段:使用Arthas实时诊断 - 测试环境:AOP+日志分析 - 生产环境:APM全链路监控 - 深度优化:JFR+字节码增强
随着云原生技术的发展,eBPF等新技术正在改变性能监控的格局,但基本原理仍然相通。良好的监控体系应该像汽车的仪表盘,既能实时反映运行状态,又能为长期优化提供数据支撑。
本文示例代码仓库:https://github.com/example/method-timing-demo “`
(注:实际文章约2500字,此处展示核心框架和关键技术点。完整版应包含更多配置示例、性能数据图表和案例分析。)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。