gpt4 book ai didi

memory - 戈朗。零垃圾传播或有效使用内存

转载 作者:IT王子 更新时间:2023-10-28 23:35:40 27 4
gpt4 key购买 nike

我时常会遇到诸如零垃圾或有效使用内存等概念。例如在知名包的特性部分 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

据我了解,第二个(从表中)没有堆内存分配,每次重复的平均分配次数为零。

问题:我想了解一下内存管理的基本知识。当垃圾收集器分配/释放内存时。基准数字是什么意思(表的最后两列)以及人们如何知道堆何时分配?

我是内存管理方面的新手,所以很难理解“幕后”发生了什么。我读过的文章:

最佳答案

垃圾收集器不分配内存:-),它只是解除分配。 Go 的垃圾收集器在不断发展,详情请看设计文档 https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true并关注 golang 邮件列表上的讨论。

基准输出中的最后两列非常简单:总共分配了多少字节,以及在基准代码的一次迭代中发生了多少分配。 (此分配由您的代码完成,而不是由垃圾收集器完成)。由于任何分配都可能产生垃圾,因此减少这些数字可能是设计目标。

什么时候在堆上分配东西?每当 Go 编译器决定!编译器尝试在堆栈上分配,但有时它必须使用堆,特别是如果一个值从本地堆栈基础范围逃逸。这种逃逸分析目前正在重新进行,因此很难判断哪个值将被分配到堆或堆栈,尤其是随着编译器版本的变化。

在您的基准测试显示过多的 GC 开销之前,我不会太着迷于避免分配。

关于memory - 戈朗。零垃圾传播或有效使用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28780543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com