# 如何知道整個系統每個方法的執行時間
## 引言
在軟件開發過程中,性能優化是永恒的話題。當系統出現性能瓶頸時,開發人員需要快速定位到耗時較長的代碼段。了解每個方法的執行時間是性能調優的基礎工作之一。本文將詳細介紹多種獲取方法執行時間的方案,涵蓋日志埋點、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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。