两个 Golang 无锁编程技法 [再续]

1 · hz · Dec. 30, 2023, 3:37 a.m.
两个有用的无锁编程技法 [再续] 接续上回的 两个 Golang 无锁编程技法 和 两个 Golang 无锁编程技法 [续] ,接下来讨论一下小内存的大量、频繁分配带来的问题及其优化思路。前两篇投身于锁和它的轻量化,衍生出来的技巧的基本上是采用以空间换性能的想法,通过制造共享数据的副本,仅在必须的时刻才回写。 例如 Entry 模式的后果就是带来大量的小块内存的分配。这对于高频交易肯定是膨胀的代价,难以接受。而像 Swap 技巧需要将数据先复制、再修改、然后再回写,这能缩短加锁时长、减小锁定面积,但 contents 尺寸很大的时候显然就难以忍受了。 所以这些场景就受到限制,它们不是万能技能。 在轻度受限的场景强行使用这些技巧,或者使用类似的思路,或者你的场景面临着同样的小内存分配问题,例如大量小字符串的场景,以上这些情况就提出了辅助手段: Golang 专用:借助 sync.Pool 复用缓冲区 一次性分配大块内存,自行管理小块内存的分配与回收 使用资源池,仅取用小对象和回收之,而不分配它 使用 AppendXXX 可能这里并不能罗列全部,以后整理脑瓜子了再继续。 借助 syn...