您好,登录后才能下订单哦!
# 如何知道整个系统每个方法的执行时间
## 引言
在软件开发过程中,性能优化是永恒的话题。当系统出现性能瓶颈时,开发人员需要快速定位到耗时较长的代码段。了解每个方法的执行时间是性能调优的基础工作之一。本文将详细介绍多种获取方法执行时间的方案,涵盖日志埋点、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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。