web-dev-qa-db-ja.com

time.Durationタイプのマイクロ秒値からミリ秒への変換

私はgo-ping( https://github.com/sparrc/go-ping )golangのライブラリを非特権ICMP pingに使用しています。

timeout := time.Second*1000
interval := time.Second
count := 5
Host := p.ipAddr
pinger, cmdErr := ping.NewPinger(Host)

pinger.Count = count
pinger.Interval = interval
pinger.Timeout = timeout
pinger.SetPrivileged(false)
pinger.Run()
stats := pinger.Statistics()

latency = stats.AvgRtt  // stats.AvgRtt is time.Duration type
jitter = stats.StdDevRtt// stats.StdDevRtt is time.Duration type

これを実行すると、ミリ秒単位の遅延とマイクロ秒単位のジッターが発生します。両方に同じ単位が必要です。たとえば、ミリ秒にマイクロ秒を変換するためにjitter = stats.StdDevRtt/1000またはjitter = jitter/1000を実行しているとき、ナノ秒単位のジッターが発生します:(。取得する方法はありますかレイテンシとジッタの両方で同じ単位ミリ秒。

31
supriya

time.Durationへの番号

time.Duration は、int64基礎となるタイプ であるタイプで、ナノ秒単位で期間を格納します。

値はわかっているが、ナノ秒以外が必要な場合は、必要な単位を単純に乗算します。例:

d := 100 * time.Microsecond
fmt.Println(d) // Output: 100µs

100は型指定されていない 定数 であり、基になる型がtime.Durationであるint64に自動的に変換できるため、上記の方法が機能します。

型付き値として値がある場合は、明示的な type conversion を使用する必要があることに注意してください。

value := 100 // value is of type int

d2 := time.Duration(value) * time.Millisecond
fmt.Println(d2) // Output: 100ms

time.Durationから数値

したがって、time.Durationは常にナノ秒です。たとえば、ミリ秒単位で必要な場合は、time.Duration値をミリ秒単位のナノ秒数で除算するだけです。

ms := int64(d2 / time.Millisecond)
fmt.Println("ms:", ms) // Output: ms: 100

他の例:

fmt.Println("ns:", int64(d2/time.Nanosecond))  // ns: 100000000
fmt.Println("µs:", int64(d2/time.Microsecond)) // µs: 100000
fmt.Println("ms:", int64(d2/time.Millisecond)) // ms: 100

Go Playground の例を試してください。

ジッタ(期間)が変換先の単位よりも小さい場合は、浮動小数点除算を使用する必要があります。そうでない場合は、整数の除算が実行され、小数部が切り捨てられます。詳細については、 Golang Round to Nearest 0.05 を参照してください。

分割する前に、ジッタと単位の両方をfloat64に変換します。

d := 61 * time.Microsecond
fmt.Println(d) // Output: 61µs

ms := float64(d) / float64(time.Millisecond)
fmt.Println("ms:", ms) // Output: ms: 0.061

出力( Go Playground で試してください):

61µs
ms: 0.061
83
icza

latencyおよびjitter変数の型はtime.Durationで、これは 定義 ごとにその基本型はint64であり、ナノ秒で表されます。

印刷関数を使用する場合、 String ‍‍‍‍型time.Durationのメソッドが呼び出され、hsmµn表記が使用されます。 Stringメソッドのドキュメント:

// String returns a string representing the duration in the form "72h3m0.5s".
// Leading zero units are omitted. As a special case, durations less than one
// second format use a smaller unit (milli-, micro-, or nanoseconds) to ensure
// that the leading digit is non-zero. The zero duration formats as 0s.

次のように、時間変数を希望の時間単位に変換するために使用できる事前定義済みの constants が時間パッケージにいくつかあります。

latencyInMicroSeconds := int64(jitter / time.Microsecond)

int型に変換したことに注意してください。そうしないと、time.Duration型のままになり、その型の値はナノ秒単位であると見なされますが、今ではさらに問題を引き起こすマイクロ秒ですタイムパッケージ関数を使用する場合の計算。

4
sepehr