Implementasi cepat dari sequence buffer dijelaskan dalam postingan blog ini oleh Glenn Fiedler di Go dengan cakupan pengujian unit 100%.
Ini dibuat dengan tujuan menciptakan protokol jaringan UDP yang andal, di mana buffer urutan dapat digunakan sebagai buffer bergulir yang efisien, tangguh, dan berukuran tetap untuk:
Nomor urut yang digunakan untuk buffer entri ditetapkan menjadi bilangan bulat 16-bit yang tidak ditandatangani, karena jumlah entri yang lebih besar akan mubazir dan akan memberikan peningkatan yang dapat diabaikan pada sistem pengenalan paket Anda.
Ukuran buffer harus habis dibagi dengan nilai maksimal bilangan bulat 16-bit yang tidak ditandatangani (65536), jika tidak, data yang di-buffer berdasarkan nomor urut tidak akan membungkus seluruh buffer. Hal ini ditemui saat menulis tes untuk perpustakaan ini.
Metode RemoveRange
dibandingkan dan dioptimalkan pada implementasi buffer urutan dalam referensi basis kode C reliabel.io untuk menggunakan beberapa panggilan memcpy
pada loop for.
Urutan aktual dan data yang di-buffer disimpan dalam dua irisan yang terpisah dan berdekatan sehingga entri yang muncul dari buffer bergulir akan tetap menjadi memori basi yang nantinya dapat dikumpulkan dari sampah.
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