nanosegundos milisegundos microsegundos go time

go - milisegundos - microsegundos a nanosegundos



Conversión de time.Duration tipo microsegundos valor a milisegundos (2)

Número a time.Duration

time.Duration es un tipo que tiene int64 como su tipo subyacente , que almacena la duración en nanosegundos.

Si conoce el valor pero desea otros nanosegundos, simplemente multiplique la unidad que desea, por ejemplo:

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

Lo anterior funciona porque 100 es una constant tipo, y se puede convertir automáticamente a tiempo. time.Duration que tiene un tipo subyacente int64 .

Tenga en cuenta que si tiene el valor como un valor escrito, tiene que usar la conversión de tipos explícita:

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

time.Duration al número

Así que el tiempo. La time.Duration es siempre los nanosegundos. Por ejemplo, si lo necesita en milisegundos, todo lo que debe hacer es dividir el time.Duration Valor de time.Duration con el número de nanosegundos en milisegundos:

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

Otros ejemplos:

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

Prueba los ejemplos en el Go Playground .

Si su fluctuación (duración) es menor que la unidad a la que desea convertirla, necesita usar la división de punto flotante, de lo contrario, se realizará una división entera que corta la parte de la fracción. Para más detalles, ver: Golang Round to Nearest 0.05 .

Convierta tanto el jitter como la unidad a float64 antes de dividir:

d := 61 * time.Microsecond fmt.Println(d) // Output: 61µs ms := float64(d) / float64(time.Millisecond) fmt.Println("ms:", ms) // Output: ms: 0.061

Salida (pruébalo en el Go Playground ):

61µs ms: 0.061

Estoy utilizando la biblioteca go-ping ( https://github.com/sparrc/go-ping ) de golang para el ping ICMP sin privilegios.

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

Al ejecutar esto, obtengo latencia en milisegundos y fluctuación en microsegundos. Quiero la misma unidad para ambos, digamos milisegundos, así que cuando estoy haciendo jitter = stats.StdDevRtt/1000 o jitter = jitter/1000 (para convertir microsegundos a milisegundos), lo que estoy obteniendo es jitter en nanosegundos :(. ¿Hay alguna manera? para obtener la misma unidad en milisegundos para latencia y fluctuación.


El tipo de latency y las variables de jitter es el tiempo. La time.Duration según la time.Duration su tipo base es int64 y se expresa en nanosegundos.

Cuando utiliza las funciones de impresión, el método de tipo String time.Duration se invoca y utiliza notaciones h , s , m , µ , n al imprimir la duración, aquí está la documentación para String método 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.

Hay algunas time.Duration predefinidas en el paquete de tiempo que puede usar para convertir la variable de duración a su unidad de tiempo preferida, como esto:

latencyInMicroSeconds := int64(jitter / time.Microsecond)

Preste atención a que lo convertimos en un tipo int porque si no lo hace aún estaría en el time.Duration tipo de time.Duration y el valor de ese tipo se considera que está en una unidad nano-segunda, pero ahora es un segundo menor, lo que causa más problemas en los cálculos Si vas a usar las funciones del paquete horario.