直接用system.currenttimemillis()记录开始和结束时间相减得毫秒耗时,起始时间放业务逻辑前、结束时间放完全执行后,需用long避免溢出,异常路径要覆盖,推荐日志占位符而非字符串拼接,可封装为无依赖工具方法。

直接用 System.currentTimeMillis() 记录开始和结束时间,相减即可得到毫秒级耗时,简单可靠,适合大多数业务场景。
获取开始和结束时间戳
在业务逻辑执行前调用一次 System.currentTimeMillis() 获取起始时间,执行完成后再次调用获取结束时间:
- 起始时间建议放在方法入口或关键操作前,避免包含日志、参数校验等非核心逻辑
- 结束时间必须放在业务逻辑完全执行完毕之后(比如数据库提交完成、响应构造结束)
- 不要跨线程使用同一组时间戳——异步任务需各自记录自己的耗时
计算并记录耗时
用结束时间减去开始时间,结果单位为毫秒:
- 推荐转成
long类型避免整型溢出,尤其当耗时可能超过 2 秒时 - 可结合日志输出,例如:
log.info("doSomething took {} ms", end - start); - 若需更高精度(如微秒),应改用
System.nanoTime(),但注意它不表示绝对时间,不能用于跨系统比对
常见误用与规避方式
看似简单,但容易踩坑:
- 把耗时统计放在 try-catch 的 catch 块里——异常路径未被覆盖,导致漏统计
- 在 finally 中计算耗时但未处理 start 时间未初始化的情况——建议统一在 try 前赋值
- 用字符串拼接日志时直接写
"cost: " + (end - start) + "ms"——推荐用占位符,避免不必要的字符串对象创建
封装成工具方法(可选)
为减少重复代码,可封装一个轻量计时器:
- 返回
long耗时值,便于进一步判断或上报 - 支持传入业务标识,方便区分不同流程,例如:
time("user-login", () -> userService.login(...)) - 不依赖第三方库,纯 JDK 实现,无额外依赖风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











