V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nazz

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

  •  
  •   Nazz · Dec 10, 2023 · 1858 views
    This topic created in 874 days ago, the information mentioned may be changed or developed.

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