Golang Go语言中用动态数组模拟链表做GC优化这个主意怎么样

发布于 1周前 作者 sinazl 来自 Go语言

一个 LRU 缓存, 小堆维护过期时间, 链表维护最近访问数据, Map 提供随机访问能力

type (
	pointer uint32
bucket struct {
	Map  *Map
	Heap *Heap
	List *List
}

Map map[string]pointer

Heap []pointer

List []Element

Element struct {
	ptr, prev, next pointer
	Key             string
	Val             any
}

)


Golang Go语言中用动态数组模拟链表做GC优化这个主意怎么样

更多关于Golang Go语言中用动态数组模拟链表做GC优化这个主意怎么样的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

并发问题没有考虑吗?

更多关于Golang Go语言中用动态数组模拟链表做GC优化这个主意怎么样的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这里只讨论 GC

上下文太少,很难直接理解你这个结构去做 GC 的使用场景,方便多说一点使用场景吗

bucket 是缓存库的基本存储结构, 源码见 https://github.com/lxzan/memorycache/tree/swiss .
现在的代码里面直接用指针式链表维护 LRU 缓存了, 实测数组链表对于 GC 优化帮助不大. 虽然数据表面都是值类型, 但实际上 string 底层是有指针的, any 可能也会被扫描.

可以避免指针,prev 、next 是数组索引

不过 string 底层还是有指针,这个解决起来很麻烦

在Golang中使用动态数组(slice)来模拟链表以实现垃圾回收(GC)优化,这个主意有其独特之处,但也需考虑其适用性和实际效益。

首先,Golang的slice本身是一个动态数组,其底层通过数组和指针实现动态扩容,这确实提供了一定的灵活性。然而,slice并不是为链表结构设计的,其扩容机制和内存布局与链表有本质区别。链表通过节点间的指针连接,可以灵活地插入和删除元素,而无需像slice那样进行大量的内存复制和重新分配。

从GC优化的角度来看,链表结构可能会减少内存碎片,因为每个节点都是独立分配的,这有助于GC更高效地回收内存。但是,如果链表节点频繁分配和释放,也可能增加GC的负担。

另一方面,Golang的slice在底层实现上已经进行了诸多优化,包括内存对齐和减少内存碎片等。在大多数情况下,使用slice进行常规操作已经足够高效,无需额外模拟链表结构。

综上所述,使用动态数组模拟链表以实现GC优化,在某些特定场景下可能有一定的效果,但并非普遍适用的解决方案。在实际应用中,应根据具体需求进行权衡和测试。如果确实需要优化内存使用和GC性能,建议深入了解Golang的内存管理机制和GC策略,并考虑使用更合适的数据结构和算法。

回到顶部