การใช้งานบัฟเฟอร์ลำดับอย่างรวดเร็วที่อธิบายไว้ในบล็อกโพสต์นี้โดย Glenn Fiedler ใน Go พร้อมความครอบคลุมการทดสอบหน่วย 100%
สิ่งนี้ถูกสร้างขึ้นเพื่อจุดประสงค์ในการสร้างโปรโตคอลเครือข่าย UDP ที่เชื่อถือได้ โดยที่บัฟเฟอร์ลำดับอาจใช้เป็นบัฟเฟอร์กลิ้งที่มีประสิทธิภาพ ยืดหยุ่น และมีขนาดคงที่สำหรับ:
หมายเลขลำดับที่ใช้ในการบัฟเฟอร์รายการได้รับการแก้ไขให้เป็นจำนวนเต็ม 16 บิตที่ไม่ได้ลงนาม เนื่องจากรายการจำนวนมากมีการซ้ำซ้อน และจะให้การปรับปรุงระบบการตอบรับแพ็กเก็ตของคุณเล็กน้อย
ขนาดของบัฟเฟอร์ต้องหารด้วยค่าสูงสุดของจำนวนเต็ม 16 บิตที่ไม่ได้ลงนาม (65536) มิฉะนั้นข้อมูลที่บัฟเฟอร์ด้วยหมายเลขลำดับจะไม่พันรอบบัฟเฟอร์ทั้งหมด สิ่งนี้เกิดขึ้นขณะเขียนการทดสอบสำหรับห้องสมุดนี้
วิธีการ RemoveRange
ได้รับการวัดประสิทธิภาพและปรับให้เหมาะสมเหนือการใช้งานบัฟเฟอร์ลำดับในโค้ดเบส C อ้างอิงที่เชื่อถือได้.io เพื่อใช้การเรียก memcpy
สองสามตัวสำหรับลูป
ลำดับจริงและข้อมูลบัฟเฟอร์จะถูกจัดเก็บไว้ในสองส่วนที่แยกจากกันและต่อเนื่องกัน เพื่อให้รายการที่โผล่ออกมาจากบัฟเฟอร์แบบกลิ้งจะยังคงเป็นหน่วยความจำเก่าซึ่งอาจเลือกที่จะรวบรวมขยะในภายหลังได้
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