更优雅的计算方法或接口耗时
一、背景#
开发时,记录某方法或任务的执行时间,或者一段代码的执行时间,如果使用System.currentTimeMillis(),很麻烦且不直观。
spring-framework和apache-common包,都提供了StopWatch类,类似计时器的逻辑封装的工具类,用法类似,spring封装的支持多任务计时,apache提供的仅支持单任务。
二、示例#
1.输出方法总耗时(秒)#
StopWatch sw = new StopWatch();
sw.start();
// 逻辑处理
Thread.sleep(6000);
sw.stop();
logger.debug("总耗时:{}秒",sw.getTotalTimeSeconds());
输出结果:
09:35:06.534 [main] INFO com.slup.authority.controller.AuthorityController - 总耗时:6.0072394秒
2.多任务计时#
StopWatch sw = new StopWatch();
sw.start("任务A");
// 任务A逻辑处理
Thread.sleep(3000);
sw.stop();
sw.start("任务B");
// 任务B逻辑处理
Thread.sleep(1000);
sw.stop();
logger.debug("总耗时:{}秒",sw.getTotalTimeSeconds());
for(TaskInfo task: sw.getTaskInfo()) {
logger.debug("[{}]耗时:{}秒",task.getTaskName(),task.getTimeSeconds());
}
输出结果:
09:49:56.517 [main] INFO com.slup.authority.controller.AuthorityController - 总耗时:4.0179818秒
09:49:56.522 [main] INFO com.slup.authority.controller.AuthorityController - [任务A]耗时:3.0099562秒
09:49:56.522 [main] INFO com.slup.authority.controller.AuthorityController - [任务B]耗时:1.0080256秒
3.其他方法#
sw.prettyPrint()
优雅格式输出所有任务耗时及占比sw.getTaskInfo()
获取所有任务对象sw.isRunning()
判断当前计时器是否正在计时sw.shortSummary()
返回简短的总耗时描述sw.currentTaskName()
获取当前正在执行的任务名称
4.总结#
- 统计代码的执行效率,推荐使用spring-framework的StopWatch对象,方法足够满足使用。
- 希望大家更多地在开发、调试的环节,就多多关注,特别是涉及多次复杂查询、内部间接口调用或者三方接口调用的情况。
- 如果觉得代码优化后不存在效率问题,则不需要将统计耗时的代码提交。
- 除非提前已知较大可能存在效率问题(比如第三方接口),否则使用debug级别日志即可,没必要使用info日志。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南