seq
1.0.0
Glenn Fiedler 的这篇博文中描述了使用 Go 语言实现序列缓冲区的快速实现,具有 100% 的单元测试覆盖率。
这是为了创建可靠的 UDP 网络协议而构建的,其中序列缓冲区可用作高效、有弹性、固定大小的滚动缓冲区,用于:
用于缓冲条目的序列号固定为无符号 16 位整数,因为大量条目是多余的,并且对数据包确认系统的改进可以忽略不计。
缓冲区的大小必须能被无符号 16 位整数的最大值 (65536) 整除,否则按序列号缓冲的数据将不会环绕整个缓冲区。在为该库编写测试时遇到了这种情况。
方法RemoveRange
在参考C代码库reliable.io中的序列缓冲区实现上进行了基准测试和优化,以在for循环上使用一些memcpy
调用。
实际序列和缓冲数据存储在两个独立的连续片中,以便从滚动缓冲区弹出的条目将保留为过时内存,稍后可以选择对其进行垃圾收集。
go get github.com/lithdew/seq
$ go test -bench=. -benchtime=10s
goos: linux
goarch: amd64
pkg: github.com/lithdew/seq
BenchmarkTestBufferInsert-8 327525945 35.6 ns/op 0 B/op 0 allocs/op
BenchmarkTestBufferRemoveRange-8 243091503 51.3 ns/op 0 B/op 0 allocs/op
BenchmarkTestBufferGenerateBitset32-8 84982886 137 ns/op 0 B/op 0 allocs/op