Una implementación rápida de buffers de secuencia descrita en esta publicación de blog de Glenn Fiedler en Go con una cobertura de prueba unitaria del 100 %.
Esto se creó con el propósito de crear protocolos de red UDP confiables, donde los buffers de secuencia se pueden usar como un buffer rodante eficiente, resistente y de tamaño fijo para:
Los números de secuencia utilizados para almacenar las entradas están fijados para que sean enteros de 16 bits sin signo, ya que cantidades mayores de entradas son redundantes y proporcionarían una mejora insignificante a su sistema de reconocimiento de paquetes.
El tamaño del búfer debe ser divisible por el valor máximo de un entero de 16 bits sin signo (65536); de lo contrario, los datos almacenados en el búfer mediante números de secuencia no abarcarían todo el búfer. Esto se produjo al escribir pruebas para esta biblioteca.
El método RemoveRange
se comparó y optimizó sobre la implementación del búfer de secuencia en la base de código C de referencia confiable.io para usar algunas llamadas memcpy
en bucles for.
Las secuencias reales y los datos almacenados en el búfer se almacenan en dos porciones contiguas separadas, de modo que las entradas que surgieron del búfer continuo permanecerán como memoria obsoleta que, opcionalmente, se puede recolectar como basura más adelante.
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