当前位置: 首页 > 面试题库 >

在Go中正确测量持续时间

闻人河
2023-03-14
问题内容

在Go中精确测量持续时间的正确方法是什么?大多数应用程序仅使用标准时间包和以下方法:

var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime

但是,time.Now()返回当前系统时间,这导致两个缺陷:

  1. 如果在测量过程中更改了系统时间(例如,由于 时区更改 (DST)或 leap秒 ),则所产生的持续时间也是错误的。
  2. 系统时间可能故意比实时时间变慢或变慢。当操作系统将内部时钟与NTP时间服务器同步时,通常会发生这种情况(每小时可能发生几次!)

从MSDN:

[时间服务]调整本地时钟速率以使其朝着正确的时间收敛。如果本地时钟与[准确时间样本]之间的时差太大而无法通过调整本地时钟速率进行校正,则时间服务会将本地时钟设置为正确的时间。

如果系统时间更改(手动更改或由于DST更改),则有可能检测到无效的持续时间并将其丢弃。但是,如果系统时钟的滴答声加快了例如10%以与世界时间同步,则实际上是不可能检测到的。这是预期的行为以及系统时钟的设计方式。

因此,大多数其他语言都提供了专用的API来测量持续时间:

  • Java has System.nanoTime()System.currentTimeMillis()将等同于time.Now()并且是错误的
  • C#有 System.Diagnostics.Stopwatch
  • C / C ++在Windows上具有QueryPerformanceCounterQueryPerformanceFrequency
  • C ++ 11及以上版本具有std::chrono::steady_clock,或者std::chrono::high_resolution_clockis_steady成员常量为true
  • JavaScript具有performance.now(),而使用new Date()则错误

在Go中精确测量执行时间的正确方法是什么?


问题答案:

包装时间

单调时钟

操作系统同时提供“挂钟”和“单调时钟”,“挂钟”会随时钟同步的变化而变化。一般规则是壁钟用于指示时间,单调时钟用于测量时间。在该程序包中,不是拆分API,而是按时间返回时间。现在,它既包含挂钟读数又包含单调时钟读数。以后的计时操作将使用挂钟读数,但以后的时间测量操作(特别是比较和减法)将使用单调时钟读数。

例如,即使在计时操作期间更改了挂钟,此代码也始终会计算约20毫秒的正经过时间:

start := time.Now()
... operation that takes 20 milliseconds ...
t := time.Now()
elapsed := t.Sub(start)

类似的其他用法,例如time.Since(start),time.Until(deadline)和time.Now()。Before(deadline),对挂钟重置也同样有效。

从Go 1.9(发布于2017年8月24日)开始,Go在持续时间内使用单调时钟。

请参阅提案:Go中的单调经过时间测量。



 类似资料:
  • 许多记者将显示测试持续时间,以及标记缓慢的测试,如“spec”记者所示: 要调整被认为“慢”的东西,您可以使用以下slow()方法: describe('something slow', function() { this.slow(10000); it('should take long enough for me to go make a sandwich', function() { /

  • 问题内容: 我有一个价值,我想得到另一个正好是1个月前的时间。 我知道可以用(想要另一个)进行减法,但这会导致a,而我反过来需要它。 问题答案: 尝试AddDate: 产生: 游乐场:http://play.golang.org/p/QChq02kisT

  • 我正在使用Saxon库应用一些XSLT 2.0转换。 我试图添加一些代码,将打印两个给定日期之间的所有日期。 为此,我试图找出如何使用持续时间变量。具体地说,我想把第一个日期加上一天,打印出来,然后重复,直到第一个日期一直增加到第二个日期。 我在XSLT中写了以下内容: 我看到撒克逊人的以下错误: 错误位于/xsl:stylesheet/xsl:template[2]/xsl:variable[1

  • 对代码基址的每一次更改都运行自动化测试 准备好开始在您的开发人员测试活动中大获全胜吗?在本期的 让开发自动化 中,开发自动化专家 Paul Duvall 介绍了几种自动化的开发人员测试,每一次改变源代码都能够运行这些测试。Paul 提供了 Selenium、DbUnit 和 JUnitPerf 测试的例子,即,如果经常 运行这些测试可以帮助您尽早发现应用程序的问题。 在像 Eclipse 那样的

  • 我想把一些h264 mp4视频转换成clearkey加密的dash。现在我想在本地主机上为他们服务。所以我没有带宽限制。我假设我应该使用dashavc264:onDemand配置文件和静态mpd,因为我的视频不是实时的,它们是离线的。 我的问题是: 我应该如何决定我应该使用什么时段?这是否取决于视频中有多少关键帧?它如何影响搜索/玩把戏性能?这会影响其他事情吗?

  • 我有一套规则,每15秒触发一次。 由于我想对这些规则进行单元测试,所以我想动态设置这个持续时间值。此外,我想把它放在我的应用程序的配置中。此值可能用于20多条规则。 我该怎么做?有可能吗? 这是我的规则: 我想要的是: 我尝试:-从单元测试中放入一个长全局变量集-从单元测试中放入一个包含“15s”的字符串全局变量集-导入一个包含静态字段的类,然后 看来没有办法了A I right?有什么建议吗?