Uma implementação rápida de buffers de sequência descrita nesta postagem do blog de Glenn Fiedler em Go com 100% de cobertura de teste de unidade.
Ele foi construído com o propósito de criar protocolos de rede UDP confiáveis, onde os buffers de sequência podem ser usados como um buffer rolante eficiente, resiliente e de tamanho fixo para:
Os números de sequência usados para armazenar entradas em buffer são fixados para serem números inteiros não assinados de 16 bits, pois quantidades maiores de entradas são redundantes e forneceriam uma melhoria insignificante ao seu sistema de reconhecimento de pacotes.
O tamanho do buffer deve ser divisível pelo valor máximo de um número inteiro não assinado de 16 bits (65536), caso contrário, os dados armazenados em buffer por números de sequência não envolveriam todo o buffer. Isso foi encontrado ao escrever testes para esta biblioteca.
O método RemoveRange
foi avaliado e otimizado sobre a implementação do buffer de sequência na base de código C de referência confiável.io para usar algumas chamadas memcpy
em loops for.
As sequências reais e os dados armazenados em buffer são armazenados em duas fatias separadas e contíguas, de modo que as entradas que surgiram do buffer contínuo permanecerão como memória obsoleta que pode, opcionalmente, ser coletada como lixo posteriormente.
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