最轻量的接口耗时统计方式是用System.currentTimeMillis()记录前后时间戳并相减,适合快速验证;可通过手动打点或Spring AOP统一拦截实现,但需注意其10–15ms精度限制,高精度场景应改用System.nanoTime(),并结合日志字段、阈值告警与采样策略落地。

直接用 System.currentTimeMillis() 记录接口调用前后的毫秒时间戳,相减就能得到响应耗时(单位:毫秒)。这是最轻量、无依赖的性能观测方式,适合快速验证和简单监控。
在接口方法里手动打点
在 Controller 或 Service 方法入口和出口处分别记录时间,计算差值:
- 入口处调用
long start = System.currentTimeMillis(); - 业务逻辑执行完后,调用
long cost = System.currentTimeMillis() - start; - 把
cost打印到日志,或通过 MDC 加入请求上下文,方便关联追踪
用 Spring AOP 统一拦截
避免每个接口都写重复代码,推荐用切面自动统计:
- 定义一个切点匹配所有 Controller 方法,比如
@Pointcut("execution(* com.example.controller..*.*(..))") - 在
@Around方法中,执行前记 start 时间,执行后算耗时并记录日志或上报指标 - 可结合注解(如
@LogExecutionTime)按需开启,减少非关键接口的开销
注意精度与误差来源
System.currentTimeMillis() 基于系统时钟,精度通常为 10–15ms(取决于操作系统),不适合微秒级测量:
立即学习“Java免费学习笔记(深入)”;
- 不要用它测单次极短操作(如纳秒级计算),会看到大量 0 或相同值
- 高并发下多个线程同时调用,时间戳本身无竞争,但日志输出或指标收集可能成为瓶颈
- 如果需要更高精度,可改用
System.nanoTime(),但它不表示真实时间,只适合计算相对间隔
结合日志或监控平台落地
光有数字没意义,要让耗时数据真正可用:
- 在日志中固定字段输出耗时,例如
"cost=127ms path=/api/user",便于 ELK 或 Loki 提取聚合 - 设置阈值告警(如 >1s 标为慢请求),配合 traceId 实现问题定位
- 避免在生产高频接口中频繁打印全量耗时日志,可用采样策略(如 1% 请求记录详细耗时)


















