在 Go 中保证至少一纳秒过去的最省时的方法是什么? time.Sleep(time.Nanosecond) 可能需要几毫秒

What is the most time efficient way to guarantee at least one nanosecond has elapsed in Go? time.Sleep(time.Nanosecond) can take milliseconds

我有两个函数调用,我想将它们分开至少一纳秒。但是我希望延迟越小越好。

下面的代码显示一个空的 for 循环比使用 time.Sleep(time.Nanosecond)

更有效

有没有更有效的方法来保证至少一纳秒已经过去?

func TimeWaster () {
    start := uint64(time.Now().UnixNano())
    stop := uint64(time.Now().UnixNano())
    fmt.Println(time.Duration(stop-start))//0s
    //no nanoseconds pass

    start = uint64(time.Now().UnixNano())
    time.Sleep(time.Nanosecond)
    stop = uint64(time.Now().UnixNano())
    fmt.Println(time.Duration(stop-start))//6.9482ms
    //much *much* more than one nanosecond passes

    start = uint64(time.Now().UnixNano())
    for uint64(time.Now().UnixNano()) == start {
        //intentionally empty loop
    }
    stop = uint64(time.Now().UnixNano())
    fmt.Println(time.Duration(stop-start))//59.3µs
    //much quicker than time.Sleep(time.Nanosecond), but still much slower than 1 nanosecond
}

您正在使用的包奇怪地按时间强制执行值的唯一性,因此您需要做的就是循环,直到 time 包不再报告当前纳秒的相同值。这不会在 1 纳秒后发生,事实上 UnixNano 在我的机器上的分辨率大约是 100 纳秒,并且大约每 0.5 毫秒更新一次。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Now().UnixNano())
    smallWait()
    fmt.Println(time.Now().UnixNano())
}

func smallWait() {
    for start := time.Now().UnixNano(); time.Now().UnixNano() == start; {}
}

循环是不言自明的,只需重复直到 UnixNano() 不同