数据质量开源框架,爱上开源之底层两个数据结构
数据质量开源框架,爱上开源之底层两个数据结构fasthttp这个项目非常的值得借鉴,虽然只是在http这块著名,但是其中的一些思想和实现方式,都被很多的网络通信的项目所借鉴, 包括一些golang net通信这块颇有名气的一些项目,查看他们的底层代码,实现都是借用fasthttp的方式。这两个数据结构的实现,已经单独为一个项目,项目地址在 github.com/gohutool/
第一个是环形队列, 在无锁队列里最有名的就是Disruptor,他的背景感兴趣的话,大家可以去网上百科一下, 他的数据结构就是用环形队列实现的。
我们这里是最简单的一个环形队列的实现, 当然这里没有实现的像disruptor那么复杂。
func TestNewLoopQueue(t *testing.T) {
size := 100
q := NewLoopQueue(size 1)
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
t.Logf("Detach : %v" q.Detach())
var i = 1
q.Insert(&i)
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
o := q.Get()
t.Logf("Get : %v" *o)
*o = 11
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
t.Logf("Detach : %v" *q.Detach())
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
}
最简单的stack
func TestNewStack(t *testing.T) {
size := 100
q := NewStack(size 1)
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
t.Logf("Detach : %v" q.Detach())
var i = 1
q.Insert(&i)
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
o := q.Get()
t.Logf("Get : %v" *o)
*o = 11
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
t.Logf("Detach : %v" *q.Detach())
t.Logf("IsEmpty : %v" q.IsEmpty())
t.Logf("Len : %v" q.Len())
}
实现上,借鉴了fasthttp, 在其基础上,使用了泛型,原有的实现,对象都是使用interface{}和any保存对象的。 interface{}的方式,在获取的时候,必须进行造型,这样会有一定的开销,在这里实现上进行了优化,对算法也进行了一定的优化, 所有的优化目的都是以性能为目标,仅可能在各个细节上都提高性能。
fasthttp这个项目非常的值得借鉴,虽然只是在http这块著名,但是其中的一些思想和实现方式,都被很多的网络通信的项目所借鉴, 包括一些golang net通信这块颇有名气的一些项目,查看他们的底层代码,实现都是借用fasthttp的方式。
这两个数据结构的实现,已经单独为一个项目,项目地址在 github.com/gohutool/