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
相关产品推荐
相关产品推荐

