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.pswp.cn/news/42058.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42058.shtml
英文地址,請注明出處:http://en.pswp.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;個人主頁??…