Une implémentation rapide des tampons de séquence décrite dans ce billet de blog de Glenn Fiedler dans Go avec une couverture de tests unitaires à 100 %.
Celui-ci a été conçu dans le but de créer des protocoles réseau UDP fiables, dans lesquels les tampons de séquence peuvent être utilisés comme tampon roulant efficace, résilient et de taille fixe pour :
Les numéros de séquence utilisés pour mettre en mémoire tampon les entrées sont fixés pour être des entiers non signés de 16 bits, car de plus grandes quantités d'entrées sont redondantes et apporteraient une amélioration négligeable à votre système d'accusé de réception de paquets.
La taille du tampon doit être divisible par la valeur maximale d'un entier non signé de 16 bits (65 536), sinon les données mises en mémoire tampon par des numéros de séquence ne s'enrouleraient pas autour de l'intégralité du tampon. Cela a été rencontré lors de l'écriture de tests pour cette bibliothèque.
La méthode RemoveRange
a été comparée et optimisée sur l'implémentation du tampon de séquence dans la base de code C de référence fiable.io pour utiliser quelques appels memcpy
sur des boucles.
Les séquences réelles et les données mises en mémoire tampon sont stockées dans deux tranches distinctes et contiguës, de sorte que les entrées sorties du tampon dynamique restent une mémoire obsolète qui peut éventuellement être récupérée ultérieurement.
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