在硬件性能不断提升的现在,软件性能依旧是开发人员关注的重点。不同类型的程序关注的具体性能指标有所不同,服务器程序注重吞吐量,游戏引擎追求渲染效率,桌面程序则关注内存消耗以及界面加载效率和流畅性。当我们需要进行性能优化时,首先需要找到性能瓶颈。本文将介绍两个WPF性能优化分析工具:内存使用率应用程序时间线的使用。

内存使用率

内存使用率是Visual Studio中集成的诊断工具之一,适用于.Net程序查找内存泄漏或者低效内存适用情况。

默认情况下,调试程序时诊断工具窗口会自动开启停靠在右侧或者底部。如果因为个人适用习惯关闭了诊断工具窗口,可以通过顶部菜单栏找到“调试”—>“窗口”—>“显示诊断窗口”或者快捷键Ctrl+Alt+F2打开诊断工具窗口。

诊断工具窗口可以查看程序运行过程CPU和内存消耗的变化,鼠标悬浮在进程内存消耗图上时,会显示任意时间点的内存消耗。

要查看内存使用情况时,可以在诊断工具窗口的内存使用情况选项卡点击“截取快照”按钮。通常我们会在内存显著增加前后各截取一次内存快照,然后对比两次快照中对象和堆大小的差异。

上图中显示了两次截图快照的时间、对象个数和堆中的字节数。其中第二条快照信息中对象个数和堆大小中括号内的数值是相对于第一条快照中的变化。对象个数和堆大小这两列中的数值是以超链接形式显示,点击后可以打开选定快照的堆视图。显示了快照捕获的完整的对象集,包括了各类型对象的个数,对象实例大小和非独占大小。点击表头可以对选定列进行排序。

并且可以通过堆试图左上角类型筛选器快速查找指定类型的内存信息。下图中显示内存中增加了1800个Student对象实例,占用大约158KB内存。

应用程序时间线

应用程序时间线工具集成在Visual Studio中的性能探测器中,用于查找XAML应用程序交互相关的性能问题。该工具提供了详细的视图显示XAML应用程序(目前不支持Avalonia)资源使用情况,可以查看UI线程使用率,可视化吞吐量,UI元素解析、布局及呈现、网络及磁盘I/O所耗费的时间。

使用应用程序时间线工具时,只需单击“调试”—>“性能探测器”或者使用快捷键Alt+F2,在“XXX.diagsession 窗口”中看到分析工具。勾选应用程序时间线后点击“开始”按钮进行性能数据收集。需要停止分析时,点击分析窗口左上角的“停止收集”按钮,等待一会儿就会生成详细的视图。在诊断会话窗口的分析工具列表中有个“内存使用率”,勾选后也可以分析内存使用情况(上一小节已详细介绍)。

UI线程使用率

UI线程使用率以柱状图的形式呈现每个时间点UI线程使用情况,并用不同色块区分ui元素解析、布局、呈现、I/O、应用程序代码、Xaml其他使用UI线程的占比。UI线程使用率过高的时间点可能表示应用程序响应能力较差,是性能优化需要关注的地方。

可视吞吐量(FPS)

“可视吞吐量(FPS)” 折线图显示了应用程序的 UI线程和复合线程上的每秒帧数 (FPS),较低的帧速率也意味着应用程序响应能力较差。

时间线详细信息

时间线详细信息视图呈现了每个时间点占用CPU的UI框架子系统和系统组件以及它们占用时间。

主要包括以下几类:

  • 解析:分析XAML文件并创建对象或者元素所消耗的时间。
  • 布局:计算所有需要布局的元素的大小和位置耗用的时间(即在ArrangeMeasureApplyTemplateArrangeOverrideMeasureOverride中所用的时间)。在大型应用程序中,可能会同时在屏幕上显示数千个元素。此显示可能会导致UI帧速率降低以及应用程序响应能力相应地变差。
  • 呈现:在屏幕上绘制XAML元素所耗用的时间。
  • I/O:从本地磁盘或从通过Microsoft Windows Internet (WinINet) API访问的网络资源中检索数据所耗用的时间。
  • 应用程序代码:执行与分析或布局无关的应用程序(用户)代码所耗用的时间。
  • Xaml其他:执行 XAML 运行时代码所耗用的时间。

时间线详细信息视图分为左中右三列。左侧显示事件名称,绝大部分事件是发生在UI线程上,这些事件名称前有一个紫色线条标记,非UI线程上的事件则无标记。中间一列顶部显示时间轴,下边显示每个事件的色块标记(与UI线程使用率中色块颜色一致)、持续总计时间(自身和子元素持续时间的总和)和自身持续时间,鼠标悬浮在元素上会显示自身持续时间和事件开始时间。右侧一列则显示选中事件的详细信息描述。

上边示例中,UI线程使用率过高,耗时最长的是布局,开始于6.91秒,总耗时6.56秒,涉及33237个元素,其原因就是TreeView没有开启虚拟化,一次性把所有的数据都渲染出来,导致UI响应差。通过这个分析找到性能瓶颈,就可以有的放矢进行优化。这里只需开启虚拟化即可,现实开发中导致性能瓶颈的原因多种多样,需结合实际情况优化解决。

小结

内存使用率应用程序时间线是WPF开发过程中不可或缺的两个有效工具,此外,Snoop以及Visual Studio中的实时可视化树、实时属性资源管理器、XAML实时预览、XAML绑定失败、辅助功能检查等工具也能提高开发调试效率。

参考

https://devblogs.microsoft.com/visualstudio/analyze-cpu-memory-while-debugging/

https://learn.microsoft.com/zh-cn/visualstudio/profiling/application-timeline?view=vs-2022

WPF性能优化:性能分析工具的更多相关文章

  1. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  2. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  3. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  4. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  5. PHP 性能追踪及分析工具(XHPROF)

    原文:https://gold.xitu.io/post/5860d23f128fe10069e1cfbf XHPROF:Facebook 开源的轻量级PHP性能分析工具. 它报告函数级别的请求次数和 ...

  6. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  7. golang 性能调优分析工具 pprof (上)

    一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...

  8. apache kafka系列之性能优化架构分析

    apache kafka中国社区QQ群:162272557 Apache kafka性能优化架构分析 应用程序优化:数据压缩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...

  9. golang 性能调优分析工具 pprof(下)

    golang 性能调优分析工具 pprof(上)篇, 这是下篇. 四.net/http/pprof 4.1 代码例子 1 go version go1.13.9 把上面的程序例子稍微改动下,命名为 d ...

  10. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

随机推荐

  1. [转帖]记录自己安装内存带宽测试工具——Stream过程

    测试环境: CPU:Kunpeng 920 8Core MEM:16G Storage:200G OS:openEuler 20.03 (LTS-SP3) 1 服务器资源监控工具--Stream 1. ...

  2. [译]深入了解现代web浏览器(二)

    本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part2/ 翻译而来,共有四篇,该篇 ...

  3. 【K哥爬虫普法】淘宝一亿快递信息泄漏,有人正在盯着你的网购!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  4. 人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

    人工智能大语言模型微调技术:SFT 监督微调.LoRA 微调方法.P-tuning v2 微调方法.Freeze 监督微调方法 1.SFT 监督微调 1.1 SFT 监督微调基本概念 SFT(Supe ...

  5. Mygin中间件优化及logger日志中间件

    本篇是mygin的第七篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现. 目的 中间件Middleware优化 ...

  6. python-ssh链接linux查询日志,并按日志等级在控制台分颜色输出日志

    import paramiko # unicode_utils.py def to_str(bytes_or_str): """ 把byte类型转换为str :param ...

  7. SpringBoot2.7集成Swagger3

    1.引入pom坐标 <!--swagger--> <dependency> <groupId>io.springfox</groupId> <ar ...

  8. iOS 常用命令行工具总结

    平时工作中会经常用到命令行工具Command Lines Tool.而Command Line Tool本质是一个命令行工具包,内部有很多有用的工具,如Apple LLVM compiler.Make ...

  9. 4599元 铭凡推出NAG6迷你主机:12代i9+RX 6600M

    铭凡推出了新款迷你主机NAG6,首发价4599元. 据了解,新款迷你主机的处理器采用的是i9-12900H,14核心20线程.24MBL3缓存,最高睿频达5.0GHz. 不仅如此,新款迷你主机内置RX ...

  10. MySQL数据库详解(上)

    MySQL(一) 1.登陆 mysql -uroot -pMyPassword 使用默认的root用户名登陆,将MyPassword改成自己的密码 2.基本操作 --注释 updata mysql . ...