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

2023-12-10 18:05:12 +08:00
 Nazz

一个 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
	}
)
1459 次点击
所在节点    Go 编程语言
6 条回复
flynnlemon
2023-12-11 08:27:29 +08:00
并发问题没有考虑吗?
Nazz
2023-12-11 08:42:48 +08:00
@flynnlemon 这里只讨论 GC
flynnlemon
2023-12-11 16:23:02 +08:00
@Nazz 上下文太少,很难直接理解你这个结构去做 GC 的使用场景,方便多说一点使用场景吗
Nazz
2023-12-11 17:21:00 +08:00
@flynnlemon bucket 是缓存库的基本存储结构, 源码见 https://github.com/lxzan/memorycache/tree/swiss .
现在的代码里面直接用指针式链表维护 LRU 缓存了, 实测数组链表对于 GC 优化帮助不大. 虽然数据表面都是值类型, 但实际上 string 底层是有指针的, any 可能也会被扫描.
lysShub
2023-12-11 23:53:24 +08:00
可以避免指针,prev 、next 是数组索引
Nazz
2023-12-12 09:19:20 +08:00
@lysShub 不过 string 底层还是有指针,这个解决起来很麻烦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/999168

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX