当前位置: 首页 > news >正文

上代码演示下Profile-Guided Optimization (PGO)

Shell脚本名叫step

#!/bin/bashif [[ $# -ne 1 ]]; then exit; firun() { C="g++ $1 main.cpp"; echo $C; $C; a.out; }case $1 in
'0') run '' ;;
'1') run '-fprofile-generate=.' ;;
'2') run '-fprofile-use=.' ;;
# -march=native不是默认选项,需显式指定,其作用是根据当前编译机器
# 的CPU自动启用支持的指令集优化。
'3') run '-O3 -march=native' ;;
esac

main.cpp

#include <chrono> // C++11时间库
#include <random>
#include <iostream>
using namespace std;auto now = chrono::high_resolution_clock::now;// 模拟热点分支(PGO优化重点)
int process (int x) {if (x > 100) // 该条件90%概率成立(模拟热点分支)return x * 2;return x + 1;
}int main () {random_device rd;auto seed = rd();mt19937 gen(seed);//生成伯努利分布随机布尔值,90% truebernoulli_distribution dist(0.9);auto start = now();int sum = 0;for (int i = 0; i < 1'000'000; ++i)sum += process(dist(gen) ? 150 : 50);// F U C K !cout << chrono::duration<double>(now() - start).count() << "s\n";exit(sum);
}

运行 (Intel N100)

~/pgo$ step 0
g++ main.cpp
0.0532354s
~/pgo$ step 1
g++ -fprofile-generate=. main.cpp
0.060655s
~/pgo$ step 2
g++ -fprofile-use=. main.cpp
0.0532936s
~/pgo$ step 3
g++ -O3 -march=native main.cpp
0.00564738s

colinsblog说:I experimented with some existing C++ 14 applications I’ve written. One, a flat-file to Parquet format converter, improved by only about five percent over an executable built with blanket -O3 optimization levels. Another, the “DCP” I’ve discussed before, improved by around thirty percent faster compared with the same program built with -O3. These tests were done with GCC 5.4, not exactly the newest. I’ll attempt to do similar tests with GCC 7 and 9.

我用的是gcc version 12.2.0 (Debian 12.2.0-14)

AI说:PGO是一种编译器优化技术,通过分析程序实际运行数据(如函数调用频率、分支路径等)生成配置文件,指导编译器对热点代码进行精准优化。其核心流程包括:插桩编译→数据采集→二次优化编译。PGO能显著提升性能,例如减少分支预测错误、优化代码布局以提高缓存命中率,在Chrome等应用中实现10%-20%的性能提升。该技术适用于计算密集型场景,需配合代表性数据收集以发挥最大效果。

AI好啊,讲PGO的中文网页基本上没有代码,而AI能编演示程序,写Makefile,虽然把-fprofile-generate和use的参数当成了文件名,导致use时说找不到文件。

补丁:step 1前得先rm *.gcda.

改成15'000'000后,0.799088s, 0.906551s, 0.800046s, 0.0843707s

http://www.hskmm.com/?act=detail&tid=27645

相关文章:

  • 所有文档每页的第一行居中对齐
  • 109
  • 一个有趣的网站,可以给自己生成一个奖牌:aitokenawards.com
  • 20232416 2025-2026-1《网络与系统攻防技术》实验一实验报告
  • day008
  • lzr 的区间(interval)
  • IRB-120机械臂socket通信接受上位机指令运行程序段
  • 1.1.1.1 金融市场的定义与功能
  • 使用c#操作elasticsearch8
  • CF45C Dancing Lessons 题解
  • APUE学习笔记之文件IO(三) - Invinc
  • note
  • 供应链优化技术助力应对疫情挑战
  • 搜索关键词 - 呓语
  • 阅读《构建之法》产生的问题
  • 每日反思
  • 每日反思(2025.10.09)
  • 软件工程学习日志2025.10.9
  • 骄傲 雨伞边缘处的暗槽 从最原初裂缝开凿 被碰触和温暖击倒 停止思考
  • 1.1.1.2 直接融资vs间接融资的区别
  • 柳高国庆小小说创作比赛的构思和成文(未完成)
  • 骄傲 孔雀羽翎上的暗槽 从最肮脏裂缝开凿 被爱意和现实击倒 停止创造
  • 10.9 CSP-S模拟28 改题记录
  • 所以相信我初登场 不会让任何人失望 无论地位不管成败 全都逃不出神的覆掌
  • 被彼此笼罩 任歌声将我们缠绕 立下誓言后再自嘲 重复仲夏夜的舞蹈 吞下这毒药
  • 朝圣显像 不及那人将门扉轻轻叩响 欢迎来到我的城市 嗅玫瑰绽放
  • Git克隆项目运行指南
  • webpack library - 指南
  • 2025.10.9 月考游寄 - Amy
  • 被彼此笼罩 任回忆将我们缠绕 狂欢者戴上了镣铐 得益者撕裂了嘴角 吞下这毒药