首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

还用 System.currentTimeMillis() 统计代码耗时?太 Low 啦

嗨,大家好,我是东哥。

聊个开发中常见又“闹心”的话题——如何优雅地输出代码执行时间。我觉得很多程序员应该都遇到过类似的场景:需要记录代码的执行耗时,但每次都得手动记录开始时间、结束时间,然后计算差值。

这样做不仅容易出错,还显得代码不够“专业”,这就很有损面子啊,尤其是被代码审查的时候(想象一下代码评审会上被怼的场景🤦‍)。

它能帮你轻松应对多种场景,解决各种开发中的“计时痛点”。就像东哥经常说的:“大道至简”。我们一起来看看这个工具究竟有多强大!

1. 直接上手,用 StopWatch 统计总耗时

首先,来个简单点的应用场景——你想测量一段代码的总执行时间。以前可能要写成这样:

long startTime = System.currentTimeMillis();// 模拟业务逻辑Thread.sleep(1000);long endTime = System.currentTimeMillis();System.out.println("Total execution time: " + (endTime - startTime) + " ms");

是不是很“朴实无华”?但当代码量变多,或者需要测量多个任务时,这种方法就显得臃肿了,而且对业务逻辑的侵入性很强(随便加个时间统计看起来就好像改了很多地方)。这时,我们就可以祭出 StopWatch。

import org.springframework.util.StopWatch;

public class StopWatchExample { public static void main(String[] args) throws InterruptedException { StopWatch sw = new StopWatch(); sw.start(); // 模拟业务逻辑,耗时1秒 Thread.sleep(1000); sw.stop(); System.out.println("总执行时间: " + sw.getTotalTimeMillis() + " ms"); }}

同样的效果,只用了三行代码,是不是瞬间“清爽”了许多?如果被问到“这代码改动大吗?”直接怼回去:我只是多加了几个 API 而已——优雅的艺术就在于“少动刀”,但效果巨佳。

2.记录每个任务的执行时间

有时候,咱们不仅需要知道代码总耗时,还需要查看每个任务的具体耗时。

比如有个“拿快递”任务和一个“泡咖啡”任务,虽然看上去都是同样时间,但哪个耗时长、哪个可以优化一下,这个要搞清楚。别一不小心就发现“原来每次泡咖啡这么浪费时间”。用 StopWatch 记录多个任务的耗时,这样写:

import org.springframework.util.StopWatch;

public class TaskTimeExample { public static void main(String[] args) throws InterruptedException { StopWatch sw = new StopWatch(); sw.start("Task A"); // 模拟任务A:拿快递,耗时1秒 Thread.sleep(1000); sw.stop(); sw.start("Task B"); // 模拟任务B:泡咖啡,耗时500毫秒 Thread.sleep(500); sw.stop(); System.out.println("任务A的执行时间: " + sw.getLastTaskTimeMillis() + " ms"); System.out.println("总耗时: " + sw.getTotalTimeMillis() + " ms"); }}

上面这段代码,咱们可以明确看到“拿快递”和“泡咖啡”的具体耗时,节省了不少心思在查“哪里拖了后腿”上。细节到位,效率才能到家。

3. 优雅输出,让耗时结果更易读

有的程序员会说:知道总耗时和每个任务的耗时就够了吗?当然不够!如果你要展示给产品经理或者老板看,你得“说人话”。

把这些时间展示得漂亮一点,直接让他们看到每个任务的占比,提升代码的可读性。这时候,用 StopWatch 的 prettyPrint() 进行优雅输出再合适不过了。

import org.springframework.util.StopWatch;

public class PrettyPrintExample { public static void main(String[] args) throws InterruptedException { StopWatch sw = new StopWatch("任务耗时统计"); sw.start("Task A"); // 模拟任务A:拿快递 Thread.sleep(500); sw.stop(); sw.start("Task B"); // 模拟任务B:泡咖啡 Thread.sleep(300); sw.stop(); sw.start("Task C"); // 模拟任务C:写代码 Thread.sleep(200); sw.stop(); System.out.println(sw.prettyPrint()); }}

执行结果会输出如下内容,直接告诉你每个任务的时间和百分比:

StopWatch '任务耗时统计': running time (millis) = 1000-----------------------------------------ms % Task name-----------------------------------------00500 050% Task A00300 030% Task B00200 020% Task C

看到了吗?这就是“颜值即正义”。

所有的任务时间、比例一目了然,再也不用担心老板看不懂了,特别适合做代码审查时的输出展示。

4. 序列服务中记录耗时

实际项目中,记录耗时的地方可能不仅限于代码执行时间。比如在调用第三方接口、生成序列号等地方,都可以用 StopWatch 来掌控全局。来,直接上代码:

import org.springframework.util.StopWatch;

public class SequenceService { public long nextSeq(String name) { StopWatch sw = new StopWatch(); sw.start("生成序列号"); // 模拟生成序列号的过程 long sequence = System.currentTimeMillis(); // 假装这是生成序列号 sw.stop(); System.out.println(sw.prettyPrint()); return sequence; } public static void main(String[] args) { SequenceService service = new SequenceService(); service.nextSeq("orderSeq"); }}

就这几行代码,让你的耗时统计优雅得“滴水不漏”。以后要再用自己写的时间差记录法,可就显得“老土”了(产品经理:这代码谁写的?)。

我觉得 StopWatch 是开发中统计代码耗时的利器,它能有效帮助我们减少手动记录的麻烦,提升代码的整洁度和可读性。

用这个工具去“秀操作”,还能避免写一大堆时间记录的冗余代码。这年头啊,优雅和效率齐飞,才是我们码农的终极追求。

愿你们的代码越写越优雅!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Ong0qxOqqKd8qYu71IdyBQdA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券