seq
1.0.0
이 블로그 게시물에 설명된 Go의 Glenn Fiedler의 시퀀스 버퍼의 빠른 구현은 100% 단위 테스트 적용 범위입니다.
이는 시퀀스 버퍼가 효율적이고 탄력적이며 고정 크기의 롤링 버퍼로 사용될 수 있는 신뢰할 수 있는 UDP 네트워킹 프로토콜을 생성하기 위한 목적으로 구축되었습니다.
항목을 버퍼링하는 데 사용되는 시퀀스 번호는 부호 없는 16비트 정수로 고정되어 있습니다. 더 많은 양의 항목이 중복되고 패킷 확인 시스템에 미미한 개선을 제공하기 때문입니다.
버퍼의 크기는 부호 없는 16비트 정수(65536)의 최대값으로 나눌 수 있어야 합니다. 그렇지 않으면 시퀀스 번호로 버퍼링된 데이터가 전체 버퍼를 둘러싸지 않습니다. 이 라이브러리에 대한 테스트를 작성하는 동안 이 문제가 발생했습니다.
RemoveRange
메서드는 루프에 대해 몇 가지 memcpy
호출을 사용하기 위해 참조 C 코드베이스 Reliable.io의 시퀀스 버퍼 구현에 대해 벤치마킹 및 최적화되었습니다.
실제 시퀀스와 버퍼링된 데이터는 롤링 버퍼에서 팝된 항목이 나중에 선택적으로 가비지 수집될 수 있는 오래된 메모리로 유지되도록 두 개의 별도 연속 슬라이스에 저장됩니다.
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