V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nazz
V2EX  ›  Go 编程语言

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

  •  
  •   Nazz · 2023-12-10 18:05:12 +08:00 · 1466 次点击
    这是一个创建于 384 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个 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
    	}
    )
    
    6 条回复    2023-12-12 09:19:20 +08:00
    flynnlemon
        1
    flynnlemon  
       2023-12-11 08:27:29 +08:00
    并发问题没有考虑吗?
    Nazz
        2
    Nazz  
    OP
       2023-12-11 08:42:48 +08:00 via Android
    @flynnlemon 这里只讨论 GC
    flynnlemon
        3
    flynnlemon  
       2023-12-11 16:23:02 +08:00   ❤️ 1
    @Nazz 上下文太少,很难直接理解你这个结构去做 GC 的使用场景,方便多说一点使用场景吗
    Nazz
        4
    Nazz  
    OP
       2023-12-11 17:21:00 +08:00
    @flynnlemon bucket 是缓存库的基本存储结构, 源码见 https://github.com/lxzan/memorycache/tree/swiss .
    现在的代码里面直接用指针式链表维护 LRU 缓存了, 实测数组链表对于 GC 优化帮助不大. 虽然数据表面都是值类型, 但实际上 string 底层是有指针的, any 可能也会被扫描.
    lysShub
        5
    lysShub  
       2023-12-11 23:53:24 +08:00
    可以避免指针,prev 、next 是数组索引
    Nazz
        6
    Nazz  
    OP
       2023-12-12 09:19:20 +08:00 via Android
    @lysShub 不过 string 底层还是有指针,这个解决起来很麻烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1149 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:26 · PVG 02:26 · LAX 10:26 · JFK 13:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.