Web开发

首页 » 常识 » 常识 » GCTT出品Go调优技术
TUhjnbcbe - 2022/11/30 21:01:00
北京哪里有治白癜风的医院 https://myyk.familydoctor.com.cn/2831/newslist_8_1.html

内存管理

在开始探索Go调优技术和工具之前,我们需要先了解一下Go内存模型,它可以帮助我们理解内存是如何使用的。

Go实现的是并行的标记-清除垃圾回收器。在传统的标记-清除模型中,垃圾回收器会先让程序停下来(也就是,“stoptheworld”),然后查找已经失效的对象,并把这些对象清理掉(也就是,释放内存)。因为程序在运行中会移动引用(references),导致垃圾的识别和清理出现困难。同时,垃圾回收也会导致延迟和其他的问题。在Go语言中GC是并发执行的,所以GC执行时,用户可能不会注意到暂停或者延迟。

调优方式

要监控程序性能,有下面几种方式:

Timers:计时器,用于基准测试,比较程序修改前与修改后的差异。Profilers:专业的调优工具,用于更高级的程序验证。工具矩阵

优点缺点ReadMemStats-简单、快速、易用。-仅描述内存使用情况。-需要改代码。pprof-详述CPU和内存使用情况。-可以远程分析。-可以生成图像。-需要改代码。-需调用API。trace-帮助分析过程数据。-强大的调试界面。-易实现问题区域的可视化。-需要改代码。-UI界面复杂。-理解需要一点时间。分析步骤

无论你用哪一种分析工具,有一个通用的原则:

识别更高层面的瓶颈例如,你可能发现了一个长时间运行的函数。减少操作量找出可替换的方法,减少时间消耗,或者调用次数。找出可替换的方法,减少内存分配量。向下挖掘数据使用工具,找出更低层、更细节的数据。思考性能更好的算法或者数据结构;找到更简单的处理方式;从实效角度审视你的代码。

基本用例

我们看一段简单的程序,它是用Go1.9.2编写的:

packagemainimport(log)//bigBytes函数分配了大约MB内存funcbigBytes()*[]byte{s:=make([]byte,000000)returns}funcmain(){fori:=;i10;i++{s:=bigBytes()ifs==nil{log.Println(ohnoes)}}}执行这个程序大概用了0.2s。

这个程序运行的不算慢,我们仅仅用它来衡量内存使用情况。

ReadMemStats

关于内存分配的情况,最简单的方式是利用runtime包的MemStats。

在下面的代码片段中,我们调整了main函数,打印出详细的内存统计信息。

funcmain(){varmemruntime.MemStatsfmt.Println(memorybaseline...)runtime.ReadMemStats(mem)log.Println(mem.Alloc)log.Println(mem.TotalAlloc)log.Println(mem.HeapAlloc)log.Println(mem.HeapSys)fori:=;i10;i++{s:=bigBytes()ifs==nil{log.Println(ohnoes)}}fmt.Println(memory

1
查看完整版本: GCTT出品Go调优技术