You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go程序在PocketBook阅读器上计算外部程序耗时异常问题

问题描述

我开发的一款Go程序运行在PocketBook电子书阅读器上,该程序会调用外部程序。我需要测量外部程序的运行耗时,但最初的计算方式得到了异常结果。

我添加了如下调试代码:

startTime := time.Now()
debug("StartTime: %s", startTime.Format("15:04:05"))
// some external program called here
endTime := time.Now()
debug("EndTime: %s", endTime.Format("15:04:05"))
duration := endTime.Sub(startTime)
debug("Duration: %s", duration)

调试输出显示:

2024/08/07 18:23:07 StartTime: 18:23:07
2024/08/07 18:24:08 EndTime: 18:24:08
2024/08/07 18:24:08 Duration: 25.137969595s

随后我改用如下方式计算秒级差值:

duration := endTime.Unix() - startTime.Unix()

该方式得到了预期结果。我想知道最初的方法哪里出错了?为什么计算出的耗时偏差如此之大?

原因分析

问题根源在于PocketBook电子书阅读器的省电时钟策略:

  • 这类设备为了延长续航,会在运行后台任务或设备处于低负载状态时,暂停系统墙钟的推进(或大幅降低时钟更新频率),但CPU实际运行时间不受影响。
  • time.Now()获取的是系统墙钟时间,当外部程序运行期间墙钟被暂停,endTime.Sub(startTime)计算的是墙钟的时间差,而非程序真实运行的耗时,所以出现了25秒和实际1分钟左右的偏差。
  • Unix()返回的是秒级时间戳,当系统恢复正常时,墙钟会自动同步到正确时间,因此两者的差值会反映真实的时间间隔,符合预期。

简单总结:墙钟时间在外部程序运行期间被设备暂停计数,导致计算出的时长远小于实际值;而秒级时间戳依赖时钟同步后的正确值,所以结果正常。

内容的提问来源于stack exchange,提问作者Skeeve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:03:14