【学到一个新名词】String interning(字符串驻留/字符串内部化)
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
在阅读 VictoriaMetrics v1.95.1 的命令行手册的时候,发现这样一段:
-internStringCacheExpireDuration duration
The expiry duration for caches for interned strings. See https://en.wikipedia.org/wiki/String_interning . See also -internStringMaxLen and -internStringDisableCache (default 6m0s)
什么是 String interning 呢?我通过了 wiki 链接学习了一下。
并且,我还找到了一个使用 String interning 技术的 golang 项目:https://github.com/josharian/intern . 作者还写了 blog: Interning strings in Go 来进一步介绍细节。
String interning 可以翻译为 字符串驻留 或者 字符串内部化。这个技巧用于节约频繁出现的字符串的空间占用,还可以用于频繁出现的字符串的比较的加速。
它的处理思路如下:
- 首先有一个全局的线程安全的键值对的字符串池;
类似于: map[string]string
然后把出现频率超级高的字符串存储在其中。
当出现新的字符串的时候,要先去字符串池中匹配。
匹配到以后,程序就可以引用字符串池中的对象,而把当前引用的对象释放掉。
当存在大量的这样内容相同的字符串的时候,这样做无疑是可以节省空间的。
在这样的场景下,相当于时间换空间。当字符串都来自字符串池,且需要频繁比较的时候,直接比较指针就可以确定是否是同一个字符串,而无需逐个字符比较。
在这样的场景下,相当于空间换时间。
让我们再看看那个简单的 golang 实现的字符串内部化的源码:
see: https://github.com/josharian/intern/blob/master/intern.go
package intern
import "sync"
var (
pool sync.Pool = sync.Pool{ // 作者想用 sync.Pool 来解决不引用时候的释放问题。但是并发环境下可能导致分配了多个键值对的字符串池。
New: func() interface{} { // sync.Pool 能够在并发环境下工作,不管怎么说,并发情况下使用不会出错。
return make(map[string]string)
},
}
)
// String returns s, interned.
func String(s string) string {
m := pool.Get().(map[string]string)
c, ok := m[s] // 这里要经过 1.计算字符串 hashcode; 2.hash 查找; 3.字符串内容比较。时间换空间的成本还是挺高的。
if ok {
pool.Put(m)
return c // 如果字符串池中存在,就置换为字符串池中的对象
}
m[s] = s // 这里不会发生并发问题
pool.Put(m)
return s
}
// Bytes returns b converted to a string, interned.
func Bytes(b []byte) string {
m := pool.Get().(map[string]string)
c, ok := m[string(b)] // string(b) 这里有个隐含的知识点:这种情况下编译器不会分配新的字符串对象。
if ok {
pool.Put(m)
return c
}
s := string(b)
m[s] = s
pool.Put(m)
return s
}
// todo: 这里还缺乏一个内容:当字符串都来自字符串池的时候,可以提供按照指针比较的方法
// 类似于:
// isSmae := &str1==&str2 || str1==str2
看完了源码,这个字符串内部化似乎也没有很复杂很高深。或许某个存在大量重复字符串的场景中,我们很能用上这个技术。
Have fun.
【学到一个新名词】String interning(字符串驻留/字符串内部化)的更多相关文章
- 什么是string interning(字符串驻留)以及python中字符串的intern机制
Incomputer science, string interning is a method of storing only onecopy of each distinct string val ...
- Java中的字符串驻留(String Interning)
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- String特性之 “字符串驻留池”
1. 字符串驻留池,就是一块与堆区并行的存放字符串对象的内存区,JVM的驻留池机制规定: 在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String ...
- [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
发布日期:2008.8.27 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 走钢丝的人,在刺激中体验快感.带着问题思考,在问题 ...
- 深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!
英文:https://arpitbhayani.me/blogs/string-interning 作者:arpit 译者:豌豆花下猫("Python猫"公众号作者) 声明:本翻译 ...
- JAVA 字符串驻留池
一切从String str = new String("abc")说起... 这行代码形式上很简单,其实很复杂.有一个常见的Java笔试题就是问上面这行代码创建了几个Stri ...
- .Net字符串驻留池
在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量 ...
- C#中字符串驻留技术
转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...
- C# 字符串驻留池
在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量 ...
- Java中的字符串驻留
转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...
随机推荐
- windows配置supervisor实现nginx自启
前言 有些老项目的nginx部署在windows server上,而且服务器比较老旧,经常异常重启.鉴于个人并不熟悉windows server,因此配置supervisor自启nginx,实现win ...
- [kvm]cpu内存硬盘配置
修改CPU配置 如果配置了最大CPU # 临时 virsh setvcpus test 2 # 永久 virsh setvcpus test 2 --config 热增加虚拟机的CPU数后,使用lsc ...
- java file I/O流
一.File的简介:(java.io包) 生活中的文件: (1)文件的作用:持久化(瞬时状态的对立面状态) (1)文件的定义:一堆数据的集合 (2)文件存储的位置:磁盘,硬盘,软盘,U盘等等 计算机中 ...
- MyBatis-Plus批量插入方法saveBatch
1. saveBatch能否提高插入的效率? 先说结论,saveBatch()方法也是一条一条的插入,也就是说它会产生多条insert语句,而不是一条insert语句,所以它不是真正的批量插入,更不能 ...
- MIT6.s081/6.828 lectrue4:page tables 以及 Lab3 心得
不管是计算机组成还是操作系统,虚拟内存都是其中的重要内容,所以这一节我会结合 CSAPP 第九章:虚拟内存 来一起复习(顺便一说,CSAPP 这一节的 lab 是要求设计一个内存分配器,也是很有意思的 ...
- IDEA使用@Autowired注解为什么会提示不建议?
在使用IDEA编写Spring相关的项目时,当在字段上使用@Autowired注解时,总会出现一个波浪线提示:"Field injection is not recommended.&qu ...
- What is TLS ?
TLS intrduction TLS是一种保障数据传输安全的一种技术(方案),它在传输层工作. 想知道TLS和SSL的关系,先看看他们的历史: 人们遇到数据传输安全问题 1994 SSL 1.0 1 ...
- 《SQL与数据库基础》18. MySQL管理
目录 MySQL管理 系统数据库 常用工具 mysql mysqladmin mysqlbinlog mysqlshow mysqldump mysqlimport source 本文以 MySQL ...
- 如何调用API接口获取淘宝商品数据
淘宝商品数据的获取是一项非常重要的技术,它可以为淘宝卖家和买家提供有利的数据分析和扩展市场的机会.调用API接口是一种快速.方便.高效的方式获取淘宝商品数据. 以下是一些步骤来调用API接口来获取淘宝 ...
- 2.7 PE结构:重定位表详细解析
重定位表(Relocation Table)是Windows PE可执行文件中的一部分,主要记录了与地址相关的信息,它在程序加载和运行时被用来修改程序代码中的地址的值,因为程序在不同的内存地址中加载时 ...
