快捷搜索:  汽车  科技

数据质量开源框架,爱上开源之底层两个数据结构

数据质量开源框架,爱上开源之底层两个数据结构fasthttp这个项目非常的值得借鉴,虽然只是在http这块著名,但是其中的一些思想和实现方式,都被很多的网络通信的项目所借鉴, 包括一些golang net通信这块颇有名气的一些项目,查看他们的底层代码,实现都是借用fasthttp的方式。这两个数据结构的实现,已经单独为一个项目,项目地址在 github.com/gohutool/ ​

第一个是环形队列, 在无锁队列里最有名的就是Disruptor,他的背景感兴趣的话,大家可以去网上百科一下, 他的数据结构就是用环形队列实现的。

数据质量开源框架,爱上开源之底层两个数据结构(1)

我们这里是最简单的一个环形队列的实现, 当然这里没有实现的像disruptor那么复杂。

数据质量开源框架,爱上开源之底层两个数据结构(2)

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{}的方式,在获取的时候,必须进行造型,这样会有一定的开销,在这里实现上进行了优化,对算法也进行了一定的优化, 所有的优化目的都是以性能为目标,仅可能在各个细节上都提高性能。

数据质量开源框架,爱上开源之底层两个数据结构(3)

fasthttp这个项目非常的值得借鉴,虽然只是在http这块著名,但是其中的一些思想和实现方式,都被很多的网络通信的项目所借鉴, 包括一些golang net通信这块颇有名气的一些项目,查看他们的底层代码,实现都是借用fasthttp的方式。

这两个数据结构的实现,已经单独为一个项目,项目地址在 github.com/gohutool/

猜您喜欢: