私は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
を実行しているとき、ナノ秒単位のジッターが発生します:(。取得する方法はありますかレイテンシとジッタの両方で同じ単位ミリ秒。
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
latency
およびjitter
変数の型はtime.Duration
で、これは 定義 ごとにその基本型はint64であり、ナノ秒で表されます。
印刷関数を使用する場合、 String
型time.Duration
のメソッドが呼び出され、h
、s
、m
、µ
、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
型のままになり、その型の値はナノ秒単位であると見なされますが、今ではさらに問題を引き起こすマイクロ秒ですタイムパッケージ関数を使用する場合の計算。