22

Go の time パッケージは、ナノ秒の精度を提供すると主張しています。 http://golang.org/src/pkg/time/time.go

それがどのように実装され、信頼できるかどうか疑問に思っています。私の疑問はPythonから来ています.Pythonは、時間とともにその困難と限界を明確に文書化しています:

http://docs.python.org/2/library/time.htmlから

さまざまなリアルタイム関数の精度は、それらの値または引数が表現される単位によって示される精度よりも低い場合があります。たとえば、ほとんどの Unix システムでは、時計は 1 秒間に 50 回または 100 回しか「時を刻みません」。

一方、time() と sleep() の精度は、同等の Unix よりも優れています。時刻は浮動小数点数で表され、time() は利用可能な最も正確な時刻を返します (利用可能な場合は Unix の gettimeofday() を使用します)。 sleep() は、非ゼロの端数の時間を受け入れます (利用可能な場合、これを実装するために Unix の select() が使用されます)。

オペレーティング システムが python に非常に苦労しているのに、Go はどのようにしてナノ秒の精度を達成するのでしょうか?

4

3 に答える 3

35

実装に関してtime.Now()は、ランタイムに実装された関数にフォールバックします。C 時間の実装とtime·nowアセンブリ(この場合は Linux amd64)の実装を確認できます。これはclock_gettime、ナノ秒の分解能を提供する を使用します。Windows では、これは を呼び出すことで実現されGetSystemTimeAsFileTime、これもナノ秒(高解像度ではなくナノ秒) を生成します。

はい、解像度はオペレーティング システムに依存し、すべての OS で正確であると期待することはできませんが、開発者はできる限り良いものにしようとしています。たとえば、go1.0.3 では、ミリ秒の精度しか提供しないの代わりにtime·nowFreeBSDが使用されます。gettimeofdaysyscall idであるため、 にclock_gettime格納されている値を見ると、これを確認できます。参照されているアセンブリを見ると、ms 値が 1000 倍されてナノ秒になっていることがわかります。ただし、これは現在修正されています。AX

確認したい場合は、ランタイム ソース コードで対応する実装を確認し、オペレーティング システムのマニュアルを参照してください。

于 2013-01-30T18:41:18.437 に答える
16

Pythonのtime.time関数の問題の1つは、 floatを返すことです。浮動小数点数は、 53ビットの精度を持つIEEE754倍精度数値です。

1970-01-01(エポック)から2 ** 30秒を超えているため、1970-01-01からナノ秒まで正確な時間を保存するには61(31 + 30)ビットの精度が必要です。

残念ながら、これはpython floatに格納できるものより7ビットまたは8ビット短いため、pythonfloatは常にgotimeよりも精度が低くなります。

float以下のデモンストレーションを定量化するために、Pythonの時間は、タイプの制限のために、せいぜい100nSまで正確であることを示しています。

>>> t = time()
>>> t
1359587524.591781
>>> t == t + 1E-6
False
>>> t == t + 1E-7
True

したがってint64、nSで開始してカウントすることにはこれらの制限はなく、nemoで非常によく説明されているように、基盤となるOSの精度に制限されます。

于 2013-01-30T23:20:39.743 に答える