从 sync.Once 中学到的两个优化技巧

标签:Go

今天在读 sync.Once 的源码时,突然发现了一个有意思的提交,让它的性能提升了一倍。

代码就直接去上面的链接看吧,我就不再贴出来了。这里有 2 个优化的地方:
  1. sync.Once 结构体中原本的字段顺序是 m 和 done,因为 done 的访问是热路径(每次调用都会访问),而 m 则在初始化后不再访问,所以可以把 done 作为第一个字段来提升性能。
  2. sync.(*Once).Do() 方法原本较长,无法被内联,而初始化后其实只有第一行的 if atomic.LoadUint32(&o.done) == 0 会被调用。因此可以把后续的代码提取成一个私有方法,这样原方法因为变短了,是可以被内联的。

0条评论 你不来一发么↓

    想说点什么呢?