精心整理了最新的面试资料和简历模板,有需要的可以自行获取
统计Spring Boot代码耗时的5种常用方法
在性能优化和问题排查过程中,准确测量代码执行时间是关键环节。本文针对Spring Boot项目,介绍五种实用的代码耗时统计方案。
一、基础计时方案
1.1 手动计时
public void processData() {
long start = System.currentTimeMillis();
// 业务代码
// ...
long cost = System.currentTimeMillis() - start;
log.info("方法执行耗时: {}ms", cost);
}
优点:实现简单,无需框架支持
缺点:代码侵入性强,维护成本高
1.2 Spring StopWatch工具
public void batchProcess() {
StopWatch watch = new StopWatch();
watch.start("任务1");
// 任务1代码...
watch.stop();
watch.start("任务2");
// 任务2代码...
watch.stop();
log.info(watch.prettyPrint());
}
特点:支持多任务分段计时,输出格式友好
二、AOP切面方案
2.1 创建计时切面
@Aspect
@Component
public class TimeCostAspect {
@Around("@annotation(com.example.TimeCost)")
public Object timeCost(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
long cost = System.currentTimeMillis() - start;
MethodSignature signature = (MethodSignature) pjp.getSignature();
String methodName = signature.getMethod().getName();
log.info("方法 [{}] 执行耗时: {}ms", methodName, cost);
return result;
}
}
2.2 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeCost {}
使用示例:
@RestController
public class DemoController {
@TimeCost
@GetMapping("/demo")
public String demo() {
// 业务逻辑
return "OK";
}
}
优势:
- 非侵入式实现
- 统一管理计时逻辑
- 支持方法级细粒度监控
三、Actuator监控方案
3.1 配置依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2 启用监控端点
management:
endpoints:
web:
exposure:
include: metrics
metrics:
tags:
application: ${spring.application.name}
3.3 使用Timed注解
import io.micrometer.core.annotation.Timed;
@RestController
public class OrderController {
@Timed(value = "order.process",
histogram = true,
percentiles = {0.5, 0.95})
@PostMapping("/order")
public Order createOrder() {
// 订单处理逻辑
}
}
监控指标:
- 平均耗时
- 最大耗时
- 百分位统计
四、Micrometer + Prometheus集成方案
4.1 添加依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
4.2 配置指标采集
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config()
.commonTags("application", "order-service");
}
4.3 查询示例(PromQL)
histogram_quantile(0.95,
sum(rate(order_process_seconds_bucket[5m]))
by (le))
可视化:配合Grafana可生成实时监控仪表盘
五、分布式链路追踪方案(SkyWalking)
5.1 部署架构
应用服务 -> SkyWalking Agent -> OAP Server -> UI
5.2 启动参数配置
java -javaagent:/path/skywalking-agent.jar
-Dskywalking.agent.service_name=your-service
-jar your-app.jar
功能特性:
- 全链路追踪
- 方法级耗时分析
- 依赖拓扑自动发现
方法对比与选型建议
方案 | 实施难度 | 功能维度 | 性能影响 | 适用场景 |
---|---|---|---|---|
手动计时 | ★☆☆☆☆ | 单方法 | 低 | 简单调试 |
AOP切面 | ★★☆☆☆ | 方法级 | 中 | 业务方法监控 |
Actuator | ★★★☆☆ | 应用级 | 低 | 健康检查与基础监控 |
Micrometer | ★★★★☆ | 系统级 | 低 | 生产环境监控 |
SkyWalking | ★★★★☆ | 全链路 | 中 | 分布式系统性能分析 |
最佳实践建议:
- 开发阶段使用AOP方案快速定位问题
- 生产环境采用Micrometer+Prometheus组合
- 微服务架构配合SkyWalking进行全链路分析
- 高并发场景注意采样率控制(建议1%~10%)
通过合理选择耗时统计方案,开发者可以快速定位性能瓶颈,有效提升Spring Boot应用的运行效率。建议根据项目阶段和具体需求,灵活组合使用多种监控手段。