noh*_*hup 5 garbage-collection memory-management heap-memory go stack-memory
提出这个问题的原因只是我的好奇心,想确定编写高性能流消费者从多个通道读取大尺寸字节数组的最佳实践是什么。(虽然过早的优化是万恶之源,但这更多的是出于好奇)。我已经阅读了有关特定于C
此处的类似方案的答案,但我要求特定的答案,因为它是一种垃圾收集语言,并且他们的文档在这里说“从正确性的角度来看,您不需要知道变量在哪里分配”。
如果我有以下代码可以从频道读取,
for {
select {
case msg := <-stream.Messages():
...snip...
Run Code Online (Sandbox Code Playgroud)
变量msg
在 case 语句的范围内。
case
声明范围会发生什么?由于这是在同一个本机函数中声明的,并且 的大小stream
可能是一个大字节片,因此该变量将存储在堆还是堆栈中,如果是堆,是否会被垃圾收集,或者堆栈指针是否出现?stream
是一个大字节切片,因此每次都会创建变量并分配内存,或者我应该提前声明变量,并在每次迭代中继续覆盖它,因此,如果涉及垃圾收集(我不确定),我可能会减少垃圾吗?如果通道值类型是切片,则变量的值msg
只是切片描述符,该描述符很小(请参阅https://blog.golang.org/go-slices-usage-and-internals)。在将切片放置到通道上之前,包含切片引用的数据的数组将已分配到其他位置。假设该值必须在分配它的函数返回后仍然存在,它将位于堆上。请注意,通道接收操作实际上并未移动或复制切片的内容。
一旦 的值msg
变得不可访问(由于变量超出范围或被分配了不同的值),假设没有其他对切片底层数组的引用,它将受到垃圾回收的影响。
在不了解程序如何工作的情况下,很难说一定程度的优化是否会有帮助。
归档时间: |
|
查看次数: |
1215 次 |
最近记录: |