5

を探しています:

1: startTime := time.Now()

2: // run something here that takes a while (measured in milliseconds)

3: duration := time.Since(startTime)

ただし、時計の時刻の変化に強いものが必要です。1 行目と 3 行目の間で時間を調整すると、期間が不正確になります。

この問題を解決するための一般的なアプローチは何ですか?また、どの Go ライブラリが関連する可能性がありますか?

ありがとう :)

4

2 に答える 2

2

Linux (AMD64) の場合、go はclock_gettimewith を使用しCLOCK_REALTIMEます。time·now実装を参照してください。

時間が戻らない単調時計 (CLOCK_MONOTONICまたは) が必要です。CLOCK_MONOTONIC_RAWLinux では、man ページは、CLOCK_MONOTONIC飛躍しないことを保証しないことを明示的に示しています。

このクロックは、システム時間の不連続なジャンプ (たとえば、システム管理者が手動でクロックを変更した場合) の影響を受けませんが、adjtime(3) および NTP によって実行される増分調整の影響を受けます。

したがって、Linux では、おそらく最適な選択はCLOCK_MONOTONIC_RAW. そのために、@MatrixFrog で言及されているクロック パッケージ を使用できます 。例:

import (
    "fmt"
    "github.com/davecheney/junk/clock"
    "time"
)

func main() {
    start := clock.Monotonic.Now()
    // work
    end := clock.Monotonic.Now()

    duration := end.Sub(start)

    fmt.Println("Elapsed:", duration)
}

参考文献:

于 2013-10-30T03:11:24.667 に答える