Golang 程序性能优化利器 PGO 详解(一):简单介绍及使用

在软件开发过程中,性能优化是不可或缺的一部分。无论是在Web服务、数据处理系统还是实时通信中,良好的性能都是至关重要的。Golang 从1.20版版本开始引入的 Profile Guided Optimization(PGO)机制能够帮助更好地优化 Go 程序的性能。

什么是 Profile Guided Optimization(PGO)?

编译器在编译程序的时候会对程序做很多优化,例如通过分析程序源代码就可以实现的 inline optimization(内联优化)、escape analysis(逃逸分析)、constant propagation(常数传播)等优化手段。但是还有一些优化手段是无法通过分析源代码来实现的,例如一个函数里有很多条件分支语句,我们会希望编译器自动优化条件分支顺序,来加快条件分支的判断,提升程序性能。但是,编译器是不知道知道实际业务场景中每个条件分支进入的次数情况的,因为这个和程序的输入有关,所以编译出的程序就没办法在具体的应用场景中达到最佳性能。在这种场景下,PGO 就能发挥很大的作用了。

Profile Guided Optimization(PGO ),也可以被称为 feedback-directed optimization (FDO),是 Go 编译器的一种优化技术,通过分析程序运行时的行为数据来优化程序的性能。PGO 工具在编译过程中收集程序运行时的数据,然后利用这些数据对程序进行针对性的优化。这个过程的实现步骤如下:

  1. 在程序运行时,使用 profiling 工具采集 profile 数据。
  2. 根据采集到的 profile 数据,对程序进行重新编译。
  3. 在重新编译后的程序中,再次采集 profile 数据,并重复步骤2,直到程序达到理想的性能。

关于性能的提升情况,Golang 官方给出的数据是,在 Go 1.21中,一组具有代表性的 Go 程序的基准测试表明,使用 PGO 构建可以提高大约2-7%的性能。随着 Golang 对 PGO的不断优化,对性能的提升作用相信也会越来越大。

使用示例

可以通过 net/http/pprof 包生成的文件作为 profile 文件,示例如下:

package mainimport ("fmt""net/http"_ "net/http/pprof"
)func IndexHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "hello world")
}func main() {http.HandleFunc("/test", IndexHandler)http.ListenAndServe(":8000", nil)
}

需要导入 net/http/pprof 这个库,这个库会生成用于采集 profile 文件的接口,这里使用 /debug/pprof/profile 接口,通过请求这个接口来获取程序运行时的数据。

1、 采集 profile 数据

访问 http://localhost:8000/debug/pprof/profile?seconds=30,这里的意思是采集30秒的数据,期间需要访问程序提供的功能接口,采集完成后将数据保存到程序主目录下,命名为 default.pgo(编译的时候,设置 -pgo 选项的值为 auto,会自动查找到此文件,使用起来更方便)
2、编译时启用 PGO 优化

编译的时候带上 -pgo 参数并且将值设置为 auto(也可以指定具体的文件),如下:

$ go build -pgo=auto -o markdown.withpgo

Golang 官方推荐使用 auto ,并且把 default.pgo 文件存放在程序主目录下维护,以方便项目的其他开发者使用 default.pgo 来对程序做性能优化。因为 PGO 是从 Go 1.20 开始引入的,所以需要将 Golang 升级到 1.20 及以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The Age of Data and AI: Challenges and Opportunities

Simply put Abstract: This paper examines the impact of the “Age of Data” on the field of artificial intelligence (AI). With the proliferation of digital technologies and advancements in data collection, storage, and processing, organizations now have ac…

进行 200 瓦太阳能 (PV) 模块设计以测量太阳能光伏阵列的电压、电流和功率、综合负荷频率和电压控制系统的方法研究(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Levenshtein python调用

函数解释: Levenshtein距离又称作编辑距离(Edit Distance),是指两个字符之间,由一个字符转变成另一个字符所需的最少编辑操作次数。被允许的操作有以下几种: a. Replace替换,将一个字符替换成另…

如何使用CSS实现一个响应式视频播放器?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式视频播放器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣…

vue输入框只能输入数字类型,禁止输入和粘贴e

js怎么去除1e里面e 方法一:使用 Number() 函数将科学计数法表示的字符串转换为数字。然后,使用 toString() 方法将其转换回字符串形式,这样就会自动移除科学计数法中的 "e" var num 1e10; // 科学计数法表示的数字 var numStr …

【小梦C嘎嘎——启航篇】string介绍以及日常使用的接口演示

【小梦C嘎嘎——启航篇】string 使用😎 前言🙌C语言中的字符串标准库中的string类string 比较常使用的接口对上述函数和其他函数的测试代码演示: 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右…

c语言每日一练(9)

前言:每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…

rollup工具打包报错问题汇总

1. (!) this has been rewritten to undefined 原因:这是因为打包后没有给this指向window,导致this undefined,因此需要配置context参数来指定代码执行环境的参数为window 解决:rollup.config.js文件中添加配置 module.exports…

算法通关村第十关 | 数组中第k个最大元素

1.数组中第k大的数字 题目: LeetCode:数组中的第k个最大元素,给定整数数组nums和整数k,请返回数组中第k个最大的元素,请注意,你需要找的是数组排序后第k个最大的元素,而不是第k个不同的元素。 运…

JVM——配置常用参数,GC调优策略

文章目录 JVM 配置常用参数Java内存区域常见配置参数概览堆参数回收器参数项目中常用配置常用组合 常用 GC 调优策略GC 调优原则GC 调优目的GC 调优策略 JVM 配置常用参数 Java内存区域常见配置参数概览堆参数;回收器参数;项目中常用配置;常…

element-Plus中el-menu菜单无法正常收缩解决方案

<el-menu :collapse"true">如图所示收缩之后&#xff0c;有子级的菜单还有箭头文字显示 从代码对比看层级就不太对了&#xff0c;嵌套错误了&#xff0c;正常下方官网的ul标签下直接是li&#xff0c;在自己的代码中&#xff0c;ul标签下是div标签&#xff0c;层…

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有&#xff1a;FairyGUI&#xff0c;VSCode 代码环境涉及到了&#xff1a;Lua VSCode插件&#xff1a;EmmyLua 在编写FairyGUI编辑器菜单前&#xff0c;了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…

【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone® IV E EP4CE10E22I8LN,FPGA-现场可编程门阵列芯片

1、MKV31F512VLL12 微控制器 (MCU) 是适用于BLDC、PMSM和ACIM电机控制应用的高性能解决方案。这些MCU采用运行频率为100MHz/120MHz、带数字信号处理 (DSP) 和浮点单元 (FPU) 的ARM Cortex-M4内核。KV3x MCU配备两个采样率高达1.2MS/s的16位ADC、多个控制定时器以及512KB闪存。 …

Codeforces Round 893 (Div. 2) D.Trees and Segments

原题链接&#xff1a;Problem - D - Codeforces 题面&#xff1a; 大概意思就是让你在翻转01串不超过k次的情况下&#xff0c;使得a*&#xff08;0的最大连续长度&#xff09;&#xff08;1的最大连续长度&#xff09;最大&#xff08;1<a<n&#xff09;。输出n个数&…

模糊测试面面观 | 模糊测试工具知多少

自1988年威斯康星大学的Barton Miller首次提出模糊测试这一概念以来&#xff0c;模糊测试领域经历了持续长久发展。模糊测试作为一种软件测试方法&#xff0c;旨在通过向程序输入模糊、随机、异常的数据&#xff0c;探测和发现潜在的漏洞和错误。这种方法备受安全研究人员的青睐…

助推打造全球研发中心城市 | 李彦团队:研发,带来了二次文艺复兴

2017年&#xff0c;长沙经联合国教科文组织评选&#xff0c;成为中国首座获评世界“媒体艺术之都”称号的城市。6年后&#xff0c;基于时代发展的新要求&#xff0c;长沙再次提出了“打造全球研发中心城市”的目标&#xff0c;并朝着新的方向迈进。 旧有的优势产业在新的研发浪…

信安通用基础知识

文章目录 密码学经典误区PGP优良保密协议信安经典其它安全手段XSS与CSRF cross site request forgeryCSRF的利用逻辑CSRF示例CSRF防范检查Referer字段添加校验token XSS cross site scripting common weakness enumeration常见密码api误用&#xff08;摘自毕设参考文献&#xf…

“深入探究JVM内部机制:如何实现Java程序的运行环境?“

标题&#xff1a;深入探究JVM内部机制&#xff1a;如何实现Java程序的运行环境&#xff1f; 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;重点讨论JVM如何实现Java程序的运行环境。我们将从JVM的结构、类加载、内存管理、垃圾…

01 Python 网络爬虫:爬虫技术的核心原理

不夸张地说&#xff0c;现在哪怕是初中生&#xff0c;只要花点儿时间、精力稍微按「网络爬虫」的开发步骤学习了解一下&#xff0c;也能把它玩得贼溜。 听起来感觉是很高大上的东西&#xff0c;但实际上并不复杂&#xff0c;也就是使用了某种编程语言按照一定步骤、规则主动通…

用Java实现原神抽卡算法

哈喽~大家好&#xff0c;好久没有更新了&#xff0c;也确实遇到了很多事&#xff0c;这篇开始恢复更新&#xff0c;喜欢的话&#xff0c;可以给个的三连&#xff0c;什么&#xff1f;你要白嫖&#xff1f;那可以给个免费的赞麻。 &#x1f947;个人主页&#xff1a;个人主页​​…