我正在使用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
(将微秒转换为毫秒)时,我得到的是几纳秒的抖动:(。有吗任何方式都可以获得相同的单位毫秒的延迟和抖动。
答案 0 :(得分:71)
time.Duration
time.Duration
是int64
为underlying type的类型,以纳秒为单位存储持续时间。
如果你知道这个值但你想要的不是纳秒,只需乘以你想要的单位,例如:
d := 100 * time.Microsecond
fmt.Println(d) // Output: 100µs
上述方法有效,因为100
是无类型constant,可以自动转换为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
答案 1 :(得分:4)
latency
和jitter
变量的类型为time.Duration
,其definition基类型为int64,以纳秒表示。
使用打印功能时,会调用time.Duration
类型的String
方法,并使用h
,s
,m
,{{1}打印持续时间时,},µ
符号,以下是n
方法的文档:
String
在时间包中有一些预先定义的constants可用于将持续时间变量转换为您首选的时间单位,如下所示:
// 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.
请注意我们将其转换为latencyInMicroSeconds := int64(jitter / time.Microsecond)
类型,因为如果您赢了,它仍然会处于int
类型,并且该类型的值被认为是纳米秒单位但现在它是微秒,如果您打算使用时间包功能,会导致计算中的进一步问题。
答案 2 :(得分:1)
从Go 1.13开始,您可以使用新的Duration方法Microseconds
和Milliseconds
,它们将持续时间作为其分别命名的单位的整数计数返回。