戈朗。零垃圾传播或有效使用内存
Golang. Zero Garbage propagation or efficient use of memory
我时不时地面对诸如零垃圾或有效使用内存等概念。例如知名包的功能部分httprouter 可以看到如下内容:
Zero Garbage: The matching and dispatching process generates zero bytes of garbage. In fact, the only heap allocations that are made, is by building the slice of the key-value pairs for path parameters. If the request path contains no parameters, not a single heap allocation is necessary.
此外,与标准库的 http.ServeMux:
相比,此包显示了非常好的基准测试结果
BenchmarkHttpServeMux 5000 706222 ns/op 96 B/op 6 allocs/op
BenchmarkHttpRouter 100000 15010 ns/op 0 B/op 0 allocs/op
据我了解,第二个(来自 table)没有堆内存分配,每次重复的平均分配次数为零。
问题:想对内存管理有一个基本的了解。当垃圾收集器 分配 / 释放内存时。基准数字是什么意思(table 的最后两列)以及人们如何知道何时分配堆?
我在内存管理方面绝对是个新手,所以真的很难理解发生了什么"under the hood"。我读过的文章:
垃圾收集器不分配内存 :-),它只是释放内存。 Go 的垃圾收集器正在发展,有关详细信息,请查看设计文档 https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true 并关注 golang 邮件列表上的讨论。
基准输出中的最后两列非常简单:总共分配了多少字节,以及在基准代码的一次迭代中发生了多少分配。 (此分配由您的代码完成,而不是由垃圾收集器完成)。由于任何分配都可能产生垃圾,因此减少这些数字可能是设计目标。
什么时候在堆上分配东西?每当 Go 编译器决定时!编译器尝试在堆栈上分配,但有时它必须使用堆,尤其是当值从本地堆栈基范围转义时。此逃逸分析目前正在进行返工,因此很难判断哪个值将被分配到堆或堆栈,尤其是随着编译器版本的变化而变化。
除非您的基准测试显示过多的 GC 开销,否则我不会太着迷于避免分配。
我时不时地面对诸如零垃圾或有效使用内存等概念。例如知名包的功能部分httprouter 可以看到如下内容:
Zero Garbage: The matching and dispatching process generates zero bytes of garbage. In fact, the only heap allocations that are made, is by building the slice of the key-value pairs for path parameters. If the request path contains no parameters, not a single heap allocation is necessary.
此外,与标准库的 http.ServeMux:
相比,此包显示了非常好的基准测试结果BenchmarkHttpServeMux 5000 706222 ns/op 96 B/op 6 allocs/op
BenchmarkHttpRouter 100000 15010 ns/op 0 B/op 0 allocs/op
据我了解,第二个(来自 table)没有堆内存分配,每次重复的平均分配次数为零。
问题:想对内存管理有一个基本的了解。当垃圾收集器 分配 / 释放内存时。基准数字是什么意思(table 的最后两列)以及人们如何知道何时分配堆?
我在内存管理方面绝对是个新手,所以真的很难理解发生了什么"under the hood"。我读过的文章:
垃圾收集器不分配内存 :-),它只是释放内存。 Go 的垃圾收集器正在发展,有关详细信息,请查看设计文档 https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true 并关注 golang 邮件列表上的讨论。
基准输出中的最后两列非常简单:总共分配了多少字节,以及在基准代码的一次迭代中发生了多少分配。 (此分配由您的代码完成,而不是由垃圾收集器完成)。由于任何分配都可能产生垃圾,因此减少这些数字可能是设计目标。
什么时候在堆上分配东西?每当 Go 编译器决定时!编译器尝试在堆栈上分配,但有时它必须使用堆,尤其是当值从本地堆栈基范围转义时。此逃逸分析目前正在进行返工,因此很难判断哪个值将被分配到堆或堆栈,尤其是随着编译器版本的变化而变化。
除非您的基准测试显示过多的 GC 开销,否则我不会太着迷于避免分配。