我可能应该先解释一下为什么我想要那个。
我理解 Go substring( s[i:j]
) 和string.Split
其他一些字符串操作就地工作:生成的子字符串共享原始字符串的相同内存块。
例如,我读取一个大字符串,解析并从中获取一些子字符串,这些子字符串将长期保存在服务器程序中,它们将“持有”来自 GC 的大内存块,浪费内存。我假设如果我可以复制这些子字符串并保留这些副本,GC 可以释放那个大字符串。
但是我在 Go 中找不到字符串复制机制,我尝试再次将其转换为[]byte
then string
,在我的特定用例中内存使用量下降了大约 3/4。
但这感觉不对:第一,它引入了两个复制操作。第二,由于我从未真正写入该字节片,我怀疑它可能会在发布版本中得到优化。
我无法想象以前没有人问过这个问题,但是我的搜索没有产生任何相关的结果,或者在 Go 中有一些更好的做法来做这些事情吗?
顺便说一句,我尝试向+""
它附加一个空字符串(),内存消耗并没有下降,我认为即使在测试版本中它也得到了优化。
为了测量内存使用情况,我调用runtime.GC()
thenruntime.ReadMemStats()
和 compare MemStats.Alloc
,这在我的测试中似乎非常一致。
天涯尽头无女友
慕田峪7331174
红颜莎娜
慕无忌1623718
相关分类