【技术实现步骤摘要】
高性能Golang内存池的实现方法、装置与电子设备
本专利技术涉及软件开发
,更具体地,涉及一种高性能Golang内存池的实现方法、装置与电子设备。
技术介绍
现有的Golang内存池的实现是在sync包中进行的。线程从内存池中申请(Get)对象,若内存池中不存在相应的对象,则会构建一个对象。在线程不再使用对象后,会将其释放(Put)到内存池中,以供后续线程再次申请对象时使用。Golang原生的内存池中,如图1所示,为根据现有技术的Golang原生内存池实现过程示意图,会为每个CPU缓存(pin)一个对象,以实现Get操作的高速无锁返回。同时,这种设置在同一个线程频繁Get、Put时,申请和释放的操作也会非常高效,即使所有线程都会调用Get和Put,性能也不会太差。但是,在跨线程的场景中,也即申请者和释放者在不同的线程中,而这两个线程又恰好由不同的CPU调度,就会导致性能急剧下降。这是因为,申请者总在执行Get操作,但所在CPU上总是没有缓存对象;释放者总在执行Put操作,所在CPU上总是堆积了一个缓存 ...
【技术保护点】
1.一种高性能Golang内存池的实现方法,其特征在于,包括:/n创建高性能Golang内存池,所述高性能Golang内存池由第一Golang原生对象池和第二Golang原生对象池组成;/n若接收到第一调用指令,则申请所述第一Golang原生对象池中的对象切片,并返回所述第一Golang原生对象池中的指定对象,同时修改所述第一Golang原生对象池的对象切片的长度,所述第一调用指令为申请者要求调用所述高性能Golang内存池中Get函数的指令;/n根据修改后第一Golang原生对象池的对象切片的长度,确定释放所述第一Golang原生对象池的对象切片的策略。/n
【技术特征摘要】 【专利技术属性】
1.一种高性能Golang内存池的实现方法,其特征在于,包括:
创建高性能Golang内存池,所述高性能Golang内存池由第一Golang原生对象池和第二Golang原生对象池组成;
若接收到第一调用指令,则申请所述第一Golang原生对象池中的对象切片,并返回所述第一Golang原生对象池中的指定对象,同时修改所述第一Golang原生对象池的对象切片的长度,所述第一调用指令为申请者要求调用所述高性能Golang内存池中Get函数的指令;
根据修改后第一Golang原生对象池的对象切片的长度,确定释放所述第一Golang原生对象池的对象切片的策略。
2.根据权利要求1所述的高性能Golang内存池的实现方法,其特征在于,还包括:
若接收到第二调用指令,则申请所述第二Golang原生对象池中的对象切片,并将所述指定对象追加到所述第二Golang原生对象池的对象切片的末尾,同时修改所述第二Golang原生对象池的对象切片的长度,所述第二调用指令为释放者要求调用所述高性能Golang内存池的Put函数的指令;
根据修改后第二Golang原生对象池的对象切片的长度,确定释放所述第二Golang原生对象池的对象切片的策略。
3.根据权利要求1或2所述的高性能Golang内存池的实现方法,其特征在于,所述创建高性能Golang内存池的步骤还包括:
将所述第一Golang原生对象池的New函数设置为能返回一个长度为N、容量为N的对象切片的函数,将所述第二Golang原生对象池的New函数设置为能返回一个长度为0、容量为N的对象切片的函数。
4.根据权利要求1或2所述的高性能Golang内存池的实现方法,其特征在于,所述返回所述第一Golang原生对象池中的指定对象的步骤具体包括:
根据所述高性能Golang内存池中Get函数的请求,从所述第一Golang原生对象池中申请一个对象切片S1,并获取对象切片S1中末尾的对象作为所述指定对象,以返回给所述高性能Golang内存池中Get函数。
5.根据权利要求4所述的高性能Golang内存池的实现方法,其特征在于,所述修改所述第一Golang原生对象池的对象切片的长度的步骤具体包括:
假设修改前所述第一Golang原生对象池的对象切片的长度为n1,则将对象切片S1的长度修改为n1-1;
相应的,所述确定释放所述第一Golang原生对象池的对象切片的策略的步骤具体包括:
若n1-1>0,则调用所述第一Golang原生对象池的Put函数,来释放对象切片S1;
若n1-1=0,则调用所述第二Golang原生对象池的Put函数,来释放对象切片S1。
技术研发人员:向阳,邱布衣,李灼锋,
申请(专利权)人:北京云杉世纪网络科技有限公司,
类型:发明
国别省市:北京;11
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。