一文读懂Go 1.20引入的PGO性能优化

本文介绍了Go 1.20引入的PGO(Profile Guided Optimization)性能优化机制,通过实例展示了如何进行环境搭建、profiling、PGO优化,并对比了优化前后性能差异,结果显示PGO可提升程序性能约10.29%,并提供了相关资源和最佳实践。
摘要由CSDN通过智能技术生成

背景

Go 1.20版本于2023年2月份正式发布,在这个版本里引入了PGO性能优化机制。

PGO的英文全称是Profile Guided Optimization,基本原理分为以下2个步骤:

  • 先对程序做profiling,收集程序运行时的数据,生成profiling文件。
  • 编译程序时启用PGO选项,编译器会根据.pgo文件里的内容对程序做性能优化。

我们都知道在编译程序的时候,编译器会对程序做很多优化,包括大家熟知的内联优化(inline optimization)、逃逸分析(escape analysis)、常数传播(constant propagation)。这些优化是编译器可以直接通过分析程序源代码来实现的。

但是有些优化是无法通过解析源代码来实现的。

比如一个函数里有很多if/else条件分支判断,我们可能希望编译器自动帮我们优化条件分支顺序,来加快条件分支的判断,提升程序性能。

但是,编译器可能是无法知道哪些条件分支进入的次数多,哪些条件分支进入的次数少,因为这个和程序的输入是有关系的。

这个时候,做编译器优化的人就想到了PGO: Profile Guided Optimization。

PGO的原理很简单,那就是先把程序跑起来,收集程序运行过程中的数据。然后编译器再根据收集到的程序运行时数据来分析程序的行为,进而做针对性的性能优化。

比如程序可以收集到哪些条件分支进入的次数更多,就把该条件分支的判断放在前面,这样可以减少条件判断的耗时,提升程序性能。

那Go语言如何使用PGO来优化程序的性能呢?我们接下来看看具体的例子。

示例

我们实现一个web接口/render,该接口以markdown文件的二进制格式作为输入,将markdown格式转换为html格式返回。

我们借助 gitlab.com/golang-commonmark/markdown 项目来实现该接口。

环境搭建

$ go mod init example.com/markdown

新建一个 main.go文件,代码如下:

package main

import (
    "bytes"
    "io"
    "log"
    "net/http"
    _ "net/http/pprof"

    "gitlab.com/golang-commonmark/markdown"
)

func render(w http.ResponseWriter, r *http.Request) {
   
    if r.Method != "POST" {
   
        http.Error(w, "Only POST allowed", http.StatusMethodNotAllowed)
        return
    }

    src, err := io.ReadAll(r.Body)
    if err != nil {
   
        log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值