- 语言经验 - 《使用google profiler 对c++应用进行性能热点分析》

        本文属于专栏《构建工业级QPS百万级服务》​​​​​        


        性能优化,是工业应用中的重要一环。因为当我们的重要目的之一是盈利时,那么成本就十分重要。而性能优化的前提是,我们知道哪一部分功能,是最耗费资源的,才能用20%的精力去解决80%的问题。

        在我使用过热点分析的工具中,最喜欢的是google profiler,因为它的信息足够详细。这里我们基于《c++11获取系统时间最快的方式》增加了3行代码,来测试这段逻辑的性能。增加代码分别是第8,51,58行

  1 #include <iostream>2 #include <chrono>3 #include <ctime>4 #include <sys/time.h>5 #include <thread>6 #include <vector>7 #include <functional>8 #include <gperftools/profiler.h>910 using namespace std;11 using namespace std::chrono;1213 const int TEST_TIMES = 1000 * 1000 * 10;1415 long long getCurrentTimeByClockGetTime() {16     struct timespec spec;17     clock_gettime(CLOCK_REALTIME, &spec);18     return spec.tv_sec * 1000LL + spec.tv_nsec / 1000000;19 }2021 long long getCurrentTimeByGetTimeOfDay() {22     struct timeval tv;23     gettimeofday(&tv, NULL);24     return tv.tv_sec * 1000LL + tv.tv_usec / 1000;25 }2627 long long getCurrentTimeByChrono() {28     return duration_cast<milliseconds>(high_resolution_clock::now().time_since_epoch()).count();29 }3031 void testFunction(const std::function<void()>& testFunc, const std::string& testName) {32     long long start = getCurrentTimeByChrono();33     for (int i = 0; i < TEST_TIMES; ++i) {34         testFunc();35     }36     long long end = getCurrentTimeByChrono();37     cout << "Using " << testName << " in thread " << this_thread::get_id() << ": " << end - start << " ms\n";38 }3940 void testMultiThread(int thread_num, const std::function<void()>& testFunc, const std::string& testName) {41     vector<thread> threads;42     for (int i = 0; i < thread_num; ++i) {43         threads.emplace_back(testFunction, testFunc, testName);44     }45     for (auto& t : threads) {46         t.join();47     }48 }4950 int main() {51     ProfilerStart("test.prof");52     testMultiThread(1, getCurrentTimeByChrono, "chrono::high_resolution_clock");53     testMultiThread(10, getCurrentTimeByChrono, "chrono::high_resolution_clock");54     testMultiThread(1, getCurrentTimeByGetTimeOfDay, "gettimeofday");55     testMultiThread(10, getCurrentTimeByGetTimeOfDay, "gettimeofday");56     testMultiThread(1, getCurrentTimeByClockGetTime, "clock_gettime");57     testMultiThread(10, getCurrentTimeByClockGetTime, "clock_gettime");58     ProfilerStop();59 }

        我们还需要执行一下命令,来安装google profiler。其中git仓库的目录和上面文件同级

  • git clone https://github.com/gperftools/gperftools.git(下载开源库gperftools/gperftools)
  • git checkout gperftools-2.5(切换到Tag 2.5)
  • cd gperftools/ && bash -x autogen.sh && ./configure && make -j(编译google profiler)
  • g++ test.cpp -std=c++11 -pthread -I gperftools/src/ gperftools/.libs/libprofiler.a(编译应用)

        当前目录会生成文件test.prof,然后执行命令

  • pprof --pdf a.out test.prof > test.pdf(pprof通过命令sudo yum install gperftools gperftools-devel安装)

        此时目录结构如下

        test.pdf打开如下图示例,可以看到每个函数的调用频率,以及顺序依赖关系。其统计原理就是等间隔时间采样,确认当前时间正在执行的函数栈,然后对每个函数栈统计运行次数。如下图中最大的方块syscall,是chrono调用的,这就是chrono慢的原因,因为它会在内核态和用户态之间切换。整个应用的执行过程37.7%的时间,都在执行该函数。

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

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

相关文章

离谱!用ChatGPT进行审稿!

离谱&#xff01;用ChatGPT进行审稿&#xff01; 关注微信公众号: DeepGoAI 在这个信息爆炸的时代&#xff0c;AI已经跑到了学术会议的后台&#xff0c;偷偷摸摸地开始“帮忙”审稿了&#xff01;&#x1f916; 最近&#xff0c;一位教授的LinkedIn动态可谓是火了一把&#xf…

qt-C++笔记之捕获鼠标滚轮事件并输出滚轮角度增量

qt-C笔记之捕获鼠标滚轮事件并输出滚轮角度增量 code review! 文章目录 qt-C笔记之捕获鼠标滚轮事件并输出滚轮角度增量1.运行2.main.cpp3.main.pro 1.运行 2.main.cpp #include <QApplication> #include <QWidget> #include <QWheelEvent> #include <…

ADC--模拟量转换成数字量

目录 一、ADC硬件组成七大部分&#xff1a; 二、单次转换&#xff0c;连续转换&#xff0c;不连续采样模式&#xff0c;扫描模式区别 1、举例(5种组合情况) 2、模拟看门狗中断的作用&#xff1a; 三、MCU使用ADC步骤 一、ADC硬件组成七大部分&#xff1a; ①输入电压&#…

7.1 Qt 中输入行与按钮

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 参考&#xff1a; 前言&#xff1a; line edit 与pushbotton的一点联动 当输入行有内容时&#xff0c;按钮才能使用&#xff0c;并能读出输入行的内容 技能&#xff1a; pushButton->setEnabled(false) 按钮不…

C++学习Day06之继承方式

目录 一、程序及输出1.1 公共继承1.1.1 父类中公共成员&#xff0c;子类可以正常访问1.1.2 父类中保护成员&#xff0c;子类类外不可以访问1.1.3 父类中私有成员&#xff0c;子类无法访问 1.2 保护继承1.2.1 父类中公共权限 子类中变为 保护权限1.2.2 父类中保护权限 子类中变为…

1.2 操作系统的发展与分类

文章目录 1.2 操作系统的发展与分类&#xff08;一&#xff09;手工操作阶段&#xff08;二&#xff09;批处理阶段——单道批处理系统&#xff08;三&#xff09;批处理阶段——多道批处理系统&#xff08;四&#xff09;分时操作系统&#xff08;五&#xff09;实时操作系统&…

基于51/STM32单片机智能衣柜 智能衣橱 换气除湿制系统 紫外线消毒

功能介绍 以51/STM32单片机作为主控系统&#xff1b; DHT11温湿度采集当前环境温度和湿度 lcd1602液晶显示当前衣柜温度&#xff0c;湿度&#xff0c;模式 AUTO&#xff1a;自动模式 MANUAL&#xff1a;手动模式 当湿度大于设置湿度上限液晶闪烁提醒 …

Jetpack Compose 第 2 课:布局

点击查看&#xff1a;Jetpack Compose 教程 点击查看&#xff1a;Composetutorial 代码 简介 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API&#xff0c;可以帮助您简化并加快 Android 界面开发。 在本教程中&a…

PCB的介质损耗角是什么“∠”?

1、什么叫介质 介质是指在某种特定条件下能够传递力、能量或信息的物质或者空间。在物理学和工程学中&#xff0c;介质通常是指固体、液体或气体&#xff0c;它们能够传递机械波、电磁波等。例如&#xff0c;在声学中&#xff0c;空气、水和固体都可以作为声波的传播介质&…

sora的理解

1、背景 近期, openai紧跟Runway、 Google、Meta等公司, 发布了视频生成模型Sora, 全面进军视频领域。官网的视频效果炸裂&#xff0c;连贯性优秀&#xff0c;生成视频时长可达60秒&#xff0c;但模拟复杂物理场景仍有瑕疵。相对Pika、Runway的效果还是有进一步提升。考虑到这…

SQL补充2:数据库的增操作

数据库的增操作 数据库的增操作主要涉及数据库的增加、数据表的增加、表记录增加以及表字段增加等&#xff1a; 数据库的增加非常简单&#xff0c;就是新创建一个数据库&#xff1b;表记录的增加指的就是新增表的数据行&#xff0c;可以是在已有表的基础上增加记录&#xff0…

基于SSM的电影购票系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影购票系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…