C++(Qt)软件调试---Windows 性能分析器WPA(28)

C++(Qt)软件调试---Windows 性能分析器WPA(28)


### 文章目录

  • [C++(Qt)软件调试---Windows 性能分析器WPA(28)](#文章目录 C++(Qt)软件调试---Windows 性能分析器WPA(28) @[toc] 1 概述🐜 2 环境准备 3 程序性能分析 4 相关地址🐐)
  • [@toc](#文章目录 C++(Qt)软件调试---Windows 性能分析器WPA(28) @[toc] 1 概述🐜 2 环境准备 3 程序性能分析 4 相关地址🐐)
  • [1 概述🐜](#文章目录 C++(Qt)软件调试---Windows 性能分析器WPA(28) @[toc] 1 概述🐜 2 环境准备 3 程序性能分析 4 相关地址🐐)
  • [2 环境准备](#文章目录 C++(Qt)软件调试---Windows 性能分析器WPA(28) @[toc] 1 概述🐜 2 环境准备 3 程序性能分析 4 相关地址🐐)
  • [3 程序性能分析](#文章目录 C++(Qt)软件调试---Windows 性能分析器WPA(28) @[toc] 1 概述🐜 2 环境准备 3 程序性能分析 4 相关地址🐐)
  • [4 相关地址🐐](#文章目录 C++(Qt)软件调试---Windows 性能分析器WPA(28) @[toc] 1 概述🐜 2 环境准备 3 程序性能分析 4 相关地址🐐)
更多精彩内容
👉内容导航 👈
👉C++软件调试 👈

1 概述🐜

软件开发中程序性能优化、性能瓶颈排查对开发人员来说是必不可少的技能。

常见的性能优化包括CPU使用率、内存使用率、内存泄漏、文件IO等。

linux下的perf工具功能非常强大,但是可惜不支持Windows;而windows中VS也提供了类似的工具(性能探查器),windows除了vs自带的性能探查器外,还有更强大的WPA、WPR、xperf可用于性能分析。

  • 可以使用xperf命令行工具或者WPR图形界面工具保存系统和应用程序事件到文件;
  • 然后使用图形界面的WPA进行分析;
  • WPA支持火焰图等多种图表分析;
  • WPA支持随时启动记录和停止记录,不需要像其它分析工具在程序启动时运行;
  • 并且WPA支持同时记录系统的和所有正在运行的进程的信息。
  • 本文中只演示如何使用WPA进行CPU性能分析,还有更多强大功能没有演示。

演示环境:

环境 版本
系统 Windows11
编译器 msvc2017/2022 由于WPA需要pdb符号表,所以如果是mingw编译器生成的程序需要使用cv2pdb工具转换。

2 环境准备

  1. 安装VS时Windows SDK中就包含了WPA分析工具;

  2. 或者单独下载安装进行安装;

  3. 可选择直接安装或者下载离线安装包;

  4. 安装完成后如下图所示。

3 程序性能分析

  1. 创建一个工程,这里我创建的是一个Qt工程;

  2. 添加如下所示代码:

    cpp 复制代码
    #include "widget.h"
    #include "ui_widget.h"
    
    #include <vector>
    #include <list>
    
    using namespace std;
    
    void fun1()
    {
        vector<int> arr;
        for (int i = 0; i < 10000000; i++)
        {
            arr.push_back(i);
        }
    }
    
    void fun2()
    {
        list<int> arr;
        for (int i = 0; i < 10000000; i++)
        {
            arr.push_back(i);
        }
    }
    void fun3()
    {
        vector<int> arr;
        arr.reserve(10000000);
        for (int i = 0; i < 10000000; i++)
        {
            arr.push_back(i);
        }
    }
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::on_pushButton_clicked()
    {
        fun1();
        fun2();
        fun3();
    }
  3. 编译启动程序后,运行WPR UI程序,如下图所示,然后点击【Start】开始记录;

  4. 记录完成后再次点击【Save】,如下所示保存记录信息到文件中。

  5. 启动WPA程序;

  6. 打开刚才保存的文件;

  1. 如下图所示,打开【Computation】【CPU Usage(Sampled)】【Utilization by COFF Group,Module, Function】;

  2. 打开后如下图所示,会显示所有程序的火焰图;

  3. 然后按快捷键【Ctrl + F】打开搜索窗口,选择【Process】,然后输入需要查找的程序名称;

  4. 找到需要分析的程序后,鼠标右键选择【Filter To Selection】;

  1. 这样就只会显示选中程序的火焰图了。

  2. 然后选择【Configure Symbol Paths】设置pdb符号表路径,选择【Load Symbols】加载符号表;

  3. 加载完成符号表后就可以如下所示查看具体函数的性能情况了。

  4. 可以在火焰图窗口上方直接搜索具体的函数名称;

  5. 或者可以打开搜索窗口,选择【Stack】查找具体的函数名称。

  1. 当火焰图过大时,看不清楚,可以选择行,然后鼠标右键设置【Filer To Flame】显示选中行往上的火焰图,或者设置【Undo Filer】取消。

  2. 注意:如果勾选了下图中的【Filter Lower Values】会对设置【Filer To Flame】的精确度有影响。

  3. 如果加载符号表时非常慢,可能是在联网下载符号表,可以选择关闭网络获取取消勾选下载符号表;

4 相关地址🐐

相关推荐
汉克老师14 分钟前
CSP-J 初赛(以满分为目标):第二十七课 《图的遍历——BFS广度优先搜索——像“水波纹”一样,一层一层地搜索》
c++·csp-j·小学生·学c++编程
闻缺陷则喜何志丹17 分钟前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
啦啦啦~~~22218 分钟前
PC端+安卓端阅读器推荐!开源本地小说阅读器软件,
android·论文阅读·windows·开源软件·福昕阅读器
汉克老师35 分钟前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
程序猿编码41 分钟前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
影视飓风TIM1 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
C++ 老炮儿的技术栈2 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化
xxwxx__2 小时前
深入理解 C++ STL:stack、queue 与 deque 从使用到底层实现全解析
开发语言·c++·算法
wuminyu2 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
郝学胜-神的一滴2 小时前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源