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

news/2024/5/13 10:49:06/文章来源:https://blog.csdn.net/ly52352148/article/details/136095184

        本文属于专栏《构建工业级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.luyixian.cn/news_show_967159.aspx

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

相关文章

【AI视野·今日Sound 声学论文速览 第四十九期】Wed, 17 Jan 2024

AI视野今日CS.Sound 声学论文速览 Wed, 17 Jan 2024 Totally 23 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers From Coarse to Fine: Efficient Training for Audio Spectrogram Transformers Authors Jiu Feng, Mehmet Hamza Erol, Joon Son Chung,…

详解tomcat中的jmx监控

目录 1.概述 2.如何开启tomcat的JMX 3.tomcat如何实现JMX的源码分析 1.概述 本文是博主JAVA监控技术系列文章的第二篇&#xff0c;前面一篇文章中我们介绍了JAVA监控技术的基石——jmx&#xff1a; 【JMX】JAVA监控的基石-CSDN博客 本文我们将从使用和源码实现两个方面聊…

如何实现远程云服务器模型部署在本地使用

远程云服务器模型部署在本地使用 1.问题说明&#xff1a; 在使用pycharm的ssh连接到远程云服务器时&#xff0c;模型已经加载成功并且出现了如下标识&#xff1a; 但是我们打开本地的7080端口&#xff0c;发现是拒绝访问。这是什么情况&#xff1f; 起初我认为是代理的问题&a…

【AI视野·今日Robot 机器人论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 17 Jan 2024 Totally 49 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Safe Mission-Level Path Planning for Exploration of Lunar Shadowed Regions by a Solar-Powered Rover Authors Olivier L…

react【六】 React-Router 路由

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…

信息学奥赛一本通1258:【例9.2】数字金字塔

1258&#xff1a;【例9.2】数字金字塔 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 44051 通过数: 26272 【题目描述】 观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以从当前点走到左下方…

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…

学习笔记19:牛客寒假训练营(DFHJK)

D 数组长度为2*1e5 ,我们知道如果超过30个非&#xff08;-1&#xff0c;1&#xff09;的数字相乘一定是大于查询的值域的 所以如果超过60&#xff08;30*2&#xff09;个数字&#xff0c;那么一定不能构成查询的数&#xff0c;而如果小于60个则可以暴力预处理一下&#xff0c…

CTFshow web(php文件上传155-158)

web155 老样子&#xff0c;还是那个后端检测。 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&…

【lesson52】 线程概念

文章目录 线程学习前的了解知识理解线程 线程学习前的了解知识 线程在进程内部执行&#xff0c;是OS调度的基本单位 OS可以做到让进程对进程地址空间进行资源的细粒度划分 比如malloc一块内存空间&#xff0c;我们拿到的一般都是起始位置&#xff0c;但是最终位置我们一般都不…

「企业应用架构」应用程序架构的当前趋势

本文有些不是最最新的&#xff0c;但是方法和思路也有借鉴意义&#xff0c;稍后会介绍Gantner的最新应用架构趋势。 应用架构概述 随着各种力量&#xff08;云、移动、社交和大数据&#xff09;的相互联系不断涌现&#xff0c;不利用这些力量的组织在未来将面临严重的业务劣势。…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Turbo编码原理

目录 Turbo码&#xff1a;无线通信中的革命性技术 引言 一、Turbo码的基本原理 1.1 卷积码基础&#xff1a; 1.2 Turbo码的构造&#xff1a; 1.2.1 分量编码器 1.2.2 随机交织器 1.2.3 穿刺和复接单元 1.3 编码器结构的重要性和影响 1.4 迭代解码&#xff1a; 1.4.1 …

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6&#xff0c;MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

docker (三)-开箱即用常用命令

一 docker架构 拉取镜像仓库中的镜像到本地&#xff0c;镜像运行产生一个容器 registry 镜像仓库 registry可以理解为镜像仓库&#xff0c;用于保存docker image。 Docker Hub 是docker官方的镜像仓库&#xff0c;docker命令默认从docker hub中拉取镜像。我们也可以搭建自己…

惊艳网页(1):数码 智能硬件 电子科技类网站首屏

Hello&#xff0c;我是大千UI工场&#xff0c;专注UI设计8年的老司机&#xff0c;本期开始分享惊艳的网站页面&#xff0c;虽说现在网站需求量少了很多&#xff0c;但在很多行业还是必不可少的。 数码电子科技类网站的首屏设计应该能够吸引用户的注意力&#xff0c;展示网站的核…

四、OpenAI之文本生成模型(Text Generation)

文本生成模型 OpenAI的文本生成模型(也叫做生成预训练的转换器(Generative pre-trained transformers)或大语言模型)已经被训练成可以理解自然语言、代码和图片的模型。模型提供文本的输出作为输入的响应。对这些模型的输入内容也被称作“提示词”。设计提示词的本质是你如何对…

五、DataX源码分析、性能参数优化

DataX源码分析 一、总体流程二、程序入口1.datax.py2.com.alibaba.datax.core.Engine.java3.切分的逻辑并发数的确认 3.调度3.1 确定组数和分组算法3.2 数据传输 三、DataX性能优化1.关键参数2.优化&#xff1a;提升每个 channel 的速度3.优化&#xff1a;提升 DataX Job 内 Ch…

Python 字符串格式化输出

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 前言 字符串格式化是编程中一个常见的需求&#xff0c;它可以们将不同类型的数据&#xff08;如数字、文本、日…

AJAXJSON入门篇

AJAX&JSON 概念&#xff1a;AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据 使用了AJAX和服务器进行通信&#xff0c;就可以使用H…