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