什么是保证Go至少经过一纳秒的最有效的时间方式?时间。睡眠(时间。纳秒)可能需要毫秒

什么是保证Go至少经过一纳秒的最有效的时间方式?时间。睡眠(时间。纳秒)可能需要毫秒,go,wait,sleep,Go,Wait,Sleep,我有两个函数调用,我想将它们分开至少一纳秒。但我希望延迟尽可能小 下面的代码显示空for循环在这方面比使用time.Sleep(time.Nanosecond) 有没有更有效的方法来保证至少一纳秒已经过去了 func TimeWaster () { start := uint64(time.Now().UnixNano()) stop := uint64(time.Now().UnixNano()) fmt.Println(time.Duration(stop-start

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

下面的代码显示空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毫秒更新一次

主程序包
进口(
“fmt”
“时间”
)
func main(){
fmt.Println(time.Now().UnixNano())
smallWait()
fmt.Println(time.Now().UnixNano())
}
func smallWait(){
对于开始:=time.Now().UnixNano();time.Now().UnixNano()==start;{}
}

循环非常简单,只需重复,直到
UnixNano()
不同

我可以问一下,为什么您会在意一纳秒已经过去了?我使用的是一个我无法控制的包。此包以纳秒为单位定义唯一性。可悲的是,我可以而且确实在同一纳秒内调用它。所以,我之所以在乎,是因为有些软件包在乎的原因与时间无关。我使用的是一个我无法控制的软件包,它定义了纳秒级的唯一性。可悲的是,我可以而且确实在同一纳秒内调用它两次。所以,我之所以在乎,是因为有些软件包是出于与时间无关的原因而这样做的。那么,你的问题就归结为等待时间不超过1纳秒,而是等到
time
软件包不再报告它在同一纳秒,这不是一回事。在我的测试中,
time.Now().UnixNano()
仅每隔0.5毫秒左右更新一次。唯一有保证的方法是只睡最少的时间,或者运行一个循环,不断检查值是否已经改变。这是我目前的决定。