zoukankan      html  css  js  c++  java
  • interning strings in go

    原文地址

    https://commaok.xyz/post/intern-strings/

    go中对这块的支持几乎没有,为什么如此呢,博主主要是评价:


    假设你想重新使用一个单独的数据hello副本?这就是字符串互连。互插字符串有两个好处。一个明显的优点是你不需要分配和复制数据。另一个是,它可以加快字符串的平等性检查速度。如果两个字符串的长度和数据指针相同,那么它们是相等的;不需要实际检查字节。

    从Go 1.14开始,Go不对大多数字符串进行内嵌。像任何形式的缓存一样,内嵌也是有代价的:并发安全的同步,垃圾回收器的复杂性,以及每次创建字符串时要执行的额外代码。而且,就像缓存一样,在有些情况下,它是有害的而不是有帮助的。如果你在处理一个字典词的列表,没有一个词会出现两次,因此对字符串进行互连是浪费时间和内存。

    func main() {
        b := []byte("hello")
        s := string(b)
        t := string(b)
        // 824634236680
        fmt.Println(pointer(s))
        // 824634236648
        fmt.Println(pointer(t))
    
    }
    
    func pointer(s string) uintptr {
        p := unsafe.Pointer(&s)
        h := *(*reflect.StringHeader)(p)
        return h.Data
    }

    可以用map来实现逻辑上的intern

    func intern(m map[string]string, b []byte) string {
        c, ok := m[string(b)]
        if ok {
            return c
        }
    
        s := string(b)
        m[s] = s
        return s
    }

    end

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    继承
    JAVA接口的继承与集合
    JAVA接口
    c++程序—敲桌子
    c++程序—水仙花数
    c++程序—while猜数字游戏
    c++程序—switch分支
    c++程序—三目运算符
    c++程序—if语句实践
    c++程序—选择结构
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12771605.html
Copyright © 2011-2022 走看看