【译】如何在调试时分析CPU和内存(Analyze CPU and Memory while Debugging)

news2024/9/25 9:36:30

您想了解如何使您的代码运行得更快,使用更少的内存,或者只是找出您的代码是否有CPU或内存问题?你当然会——你是一名开发人员!但是,内存和性能调优经常会遇到“重要但不紧急”的任务,因为真正紧急的事情,您似乎根本无法完成。所以为什么不把这个任务离你更近一点呢?
在这篇文章中,我们将看看如何在Visual Studio 2015 Update 1中使用集成了调试器的性能和内存工具。在不离开调试工作流程的情况下,这些工具可以让您快速回答诸如“我的内存占用情况如何?”“是什么在使用这些内存?”,“我应该关心这段代码的性能吗?”、“为什么这么慢?”虽然我们显示ASP。在调试Windows桌面应用程序和面向桌面的c# /VB/ c++通用Windows应用程序时,这些工具也可以工作。
如果你喜欢这篇博文,请加入我们的Visual Studio性能工具社区,了解最新情况,并帮助指导未来的功能。

发现性能和内存问题

优化代码性能的第一步是了解需要改进的地方。为了解决这个问题,PerfTips和Visual Studio 2015调试器中的诊断工具窗口为您提供内联的、可浏览的性能信息。
要使用PerfTips,只需要设置一个断点并遍历一行代码,您就会看到PerfTip出现在指令指针(黄色箭头)的右侧,并显示已经过的(时钟)时间。在本例中,它告诉我们第57行运行时间为1406ms,这通常是等待I/O(例如HTTP调用或读取fi)所花费时间的总和
在这里插入图片描述
如果这个数字比您希望的要高,请多运行几次相同的代码,看看是否得到一致的结果。在许多情况下,您可以单击+拖动指令指针(黄色箭头)返回以重新运行代码,而不必停止调试会话。
要查看应用程序的CPU和内存消耗,请打开诊断工具窗口(调试>显示诊断工具或Ctrl+Alt+F2):
在这里插入图片描述
当你开始调试时,诊断工具窗口默认打开,你可以让它打开,以便在调试时随时关注应用程序的CPU和内存消耗。
将鼠标悬停在CPU和内存图表上,你会看到一个工具提示,显示应用程序的私有内存和CPU消耗在任何时间点的百分比:
在这里插入图片描述
在内存图的上方,你会看到断点和步骤的时间轴,这样你就可以将CPU和内存消耗与代码的特定部分联系起来:
在这里插入图片描述
同样,如果您看到的值比预期的要高,请多次运行代码,看看是否得到类似的值。或者单击其中一个中断事件(矩形),将所选时间范围设置为该事件,这对于查看下一节中显示的详细CPU使用情况信息非常有用。
如果您决定进行改进,再单击几下就可以得到CPU和内存使用情况的细分,以帮助确定改进的机会。接下来我们将向您展示如何做到这一点!

降低CPU使用率

当您发现CPU使用量激增时,您的第一反应可能是尝试一些代码替代方案,看看哪一个使用最少的CPU。但是,如果您不知道问题可能是什么,或者想要验证导致问题的代码路径,请单击“诊断工具”窗口中的“CPU使用情况”选项卡,然后单击“CPU分析”开始记录CPU上运行的功能:
在这里插入图片描述

这样做每毫秒对CPU上的调用堆栈进行一次采样,这会给调试增加少量的性能开销。但是,它通常足够小,您可以在调试会话期间让它运行。
查看CPU数据的最简单方法是在相关代码段的开始和结束处设置断点,如下面的第55行和第65行所示。当调试器到达第55行时,按F5运行代码块(注意第65行出现的PerfTip !):
在这里插入图片描述

“诊断工具”窗口自动将当前时间选择设置为这两个断点之间的时间(就好像您单击了中断事件一样)。您还可以通过单击并拖动图形中的CPU峰值来设置时间范围选择。在这两种情况下,CPU使用率选项卡中的表显示了筛选到选定时间范围的调用树:
在这里插入图片描述

调用树提供了所有记录的调用堆栈的聚合视图。您可以展开树中的节点,以跟踪一系列函数调用(或调用堆栈的一部分),并查看下面代码路径中的CPU使用情况。总CPU (ms)显示了在给定函数及其所有父函数调用中花费的大约时间;“Total CPU(%)”提供“Total CPU (ms)”列的百分比细分。
在这里,我们看到,当GetDriverList调用DeserializeDriversJSON时,我们花费了1067ms,而GetIndividualDriverCached又调用了它,等等。右键单击任意函数a

减少内存消耗

要查看内存使用明细,请在“诊断工具”窗口中打开“内存使用情况”选项卡,然后单击“快照”。通过在内存增加之前和之后拍摄快照,您可以过滤视图,以查看在对象和堆大小方面两者之间的变化:
在这里插入图片描述

当您拍摄两个或多个快照时,括号内的数字显示了与表中前一个快照的差异。所有蓝色文本都是打开堆视图的超链接,以查看该快照中捕获的完整对象集,包括对象计数,它们的大小,以及该类型的所有实例的包含大小加上所有引用类型的大小:
在这里插入图片描述

在本例中,我们有100,025个DocumentResponse。堆中的驱动程序对象的大小总计约为91MB。
单击括号中的链接可以让您更具体地分析差异:
在这里插入图片描述
在这里插入图片描述

按包含大小差异排序将指向导致两个快照之间内存增长的对象。在本例中,diff视图显示了5个新的驱动程序对象,两个快照之间内存增长了~54MB。DriverCache、Dictionary和List对象的包含大小表明它们都是可能的罪魁祸首。
在查看被管理快照时,您可以选择一个对象,查看对该对象的引用和对该对象的引用。Paths to Root选项卡显示了其他对象对所选类型的引用:
在这里插入图片描述

这里我们看到DriverCache对象有一个字典,它在两个快照之间创建了5个对驱动对象的新引用。要跳转到DriverCache查看它在做什么,只需右键单击并选择Go To Definition。
引用类型选项卡显示所选类型引用的对象:
在这里插入图片描述

在这里,我们看到Driver对象在两个快照之间添加了50MB字节数组的引用和2MB字符串的引用。
我们在这里看到的类似步骤也适用于c++,只是有一些小区别。在调试c++时,在拍摄快照之前,首先要切换“Heap Profiling”按钮,这样您就可以查看特定类型的实例,然后查看每个实例的分配堆栈,而不是使用引用列表。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后,各大平台软件常常会邀请用户在口味,配送速度等多个方面给与评分。在 element-ui 组件中,已经有相应的 Rate 组件,但是已有组件…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中,我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快,但牺牲了准确性,而…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间,查看网络资源也一直没找到解决方法,今天查看Latex官方文档,才发现因为mul…

spring cloud 整合Feign经行远程调用

文章目录 Feign远程调用Feign替代RestTemplate1)引入依赖2)添加注解3)编写Feign的客户端4)测试5)总结 自定义配置配置文件方式Java代码方式 Feign使用优化 Feign远程调用 先来看我们以前利用RestTemplate发起远程调用…

将rtsp视频流发送到AWS Kinesis Video Streams的方案——使用Gstreamer(C++) Command Line

大纲 1 创建Kinesis Video Streams1.1 创建视频流1.2 记录Creation Time 2 创建策略2.1 赋予权限2.2 限制资源2.3 Json格式描述(或上面手工设置)2.4 注意事项 3 创建IAM用户3.1 生成密钥对3.2 附加策略3.3 记录访问密钥对 4 编译C 创建者库5 发送6 检查参…

聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- mutableStateListOf

Jekpack Compose “状态订阅&自动刷新” 系列: 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - MutableState/mutableStateOf 】 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - remember 和重组作用域 】 【 聊聊 Jetpack Compose 的 …

非标设计之气缸类型

空压机: 空压机又称空气压缩机,简单来说就是将机械能转化为压力能来进行工作的,空压机在电力行业应用比较多,除了在电力行业应用较多外,其实空压机还有一个比较常见的用途就是用来制冷和分离气体,输送气体…

java SSM毕业生信息管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

前言 学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范管理、科学统计和快速查询、修改、增加、删除等,从而减少管…

【力扣热题100】207. 课程表 python 拓扑排序

【力扣热题100】207. 课程表 python 拓扑排序 写在最前面207. 课程表解决方案:判断是否可以完成所有课程的学习方法:拓扑排序实现步骤Python 实现性能分析结论 写在最前面 刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/course-schedule…

[leetcode ~二叉树] 模版

文章目录 1. 左叶子之和2. 翻转二叉树 E 1. 左叶子之和 :::details 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15&…

Proteus仿真--基于1602LCD与DS18B20设计的温度报警器

本文介绍基于1602LCD与DS18B20设计的温度报警器设计(完整仿真源文件及代码见文末链接) 仿真图如下 其中温度传感器选用DS18B20器件,主要用于获取温度数据并上传,温度显示1602LCD液晶显示器,报警模块选用蜂鸣器&#…

隐写术和人工智能

在一项新的研究中,人工智能对齐研究实验室 Redwood Research 揭示了大型语言模型 (LLM) 可以掌握“编码推理”,这是一种隐写术形式。 这种有趣的现象使得大型语言模型能够以人类读者无法理解的方式巧妙地将中间推理步骤嵌入到生成的文本中。 大型语言…

从零开始学习 JS APL(五):完整指南和实例解析

目录 学习目标: 学习内容: 学习时间: 学习内容: Window对象: 定时器-延时函数: JS 执行机制: location对象: 本地存储: 本地存储分类- localStorage&#xff1a…

Fiddler移动端抓包

本篇文章,博主想使用通俗易懂的话语,让大家明白以下内容: 什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包 抓包 包 (Packet) 是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。 我们平常…

uniapp 云打包 生成安卓证书文件

现在使用uniapp来开发小程序,H5,APP越来越多了,目前开发了一款APP,使用的也是uniapp。在此记录下用uniapp开发app云打包时约到的一些问题吧。 前因是我司安卓同学休产假,像云打包时需要的证书文件只能自己动手来搞。看…

ai绘画Midjourney绘画提示词Prompt教程

一、Midjourney绘画工具 SparkAi【无需魔法使用】: SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!本系统使用NestjsVueTypescript框架技术,持续集成AI能力到…

【计算机网络笔记】物理层——物理介质

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

element-ui upload组件中将file文件数据转成二进制流数据格式

方法一 handleBeforeUpload (file)const reader new FileReader()reader.readAsArrayBuffer(file)reader.onload async function (theFile) {const binary new Blob([theFile.target.result]) // 转成二进制流数据 即binary数据格式}}方法二 const aBlob new Blob([file],…