鹅厂优文 | 企点PC端性能测试-UI卡顿分析

作者:付煜 | 腾讯SNG系统工程师

一、背景

PC端的测试过程中会碰到一些性能问题,例如UI卡顿,内存泄漏等等,为了找到原因,做了很多的调研和尝试,也总结了一些方法。本文以一个企点融合工作台测试中发现的案例说明如何获得UI卡顿数据,以及如何分析数据,定位问题

二、案例介绍

点击工作台拨号盘时,数字按钮的响应可以感觉到明显的卡顿。以下是修复前和修复后的效果对比

修复前
修复后

三、工具介绍

目前业界用的比较多的Windows性能测试工具主要有:

  • WPT(Windows performance toolkit):微软官方的性能测试工具,集成在Windows SDK
  • UIforETW:开源工具,下载地址

在前期的调研中,WPT可以说是 “举步维艰“,而UIforETW则是“纵享丝滑”,基于以下原因,最终选择了UIforETW:

WPT

UIforETW

资料

文档少且简单:包括官网和第三方文档

文档丰富:约160篇文章和4个视频

使用门槛

门槛高:自定义配置较多

门槛低:默认配置完善

其实无论是WPT还是UIforETW都是基于Xperf的工具,而Xperf的基础又是ETW(Event Tracing for Windows)ETW是一个生产者消费者模式的系统,它提供了内核级的事件跟踪能力。

ETW有三个成员组成:

  1. Controllers,负责启动停止Event Tracing Session,负责启用停止Providers。
  2. Providers,负责向Event Tracing Session中输出事件。
  3. Consumers,从Event Tracing Session中获取事件。

具体的原理请参考Xperf原理

四、案例分析

只要UI 线程Delay时间超过200 ms,Microsoft-Windows-Win32k Provider就会记录事件,并在UI Delay图中显示

1、测试场景

鼠标点击工作台拨号盘任意数字按钮5次

2、数据获取

点击Start Tracing后,复现卡顿现场,接着点击Save Trace Buffers即可,生成的数据文件显示在Traces

双击打开数据文件,左侧的Graph Explorer展示了获取到的图形列表,包含了System Activity,CPU Usage,File I/O等,找到UI Delay图形

双击大图展示如下:

从图中可以看到,QiDian(7320)的3840线程总共有5次卡顿,每次卡了约0.5s,共约2.7s

3、卡顿分析

选择5次卡顿的任意一次进行分析,打开CPU(Precise)图形,找到QiDian.exe(7320)和3840线程

简单介绍一下图中表格列的含义:

  • New Thread Id: 即将开始执行线程(即将切换到运行状态的线程)Id
  • New Thread Stack :即将开始执行线程的调用栈
  • Time Since Last :线程处于准备状态和等待状态的时间和
  • Count:上下文切换次数
  • CPU Usage(in view):CPU耗时

结合UI Delay图和CPU图形可知,线程3840卡了约0.5 s,其中只有10 ms消耗了CPU,所以这个线程是空闲挂起状态。

为了查看具体的调用栈,在Trace下配置PDB符号表路径并加载符号表

Time Since Last排序后,查看New Thread Stack列,依次展开

可以很清楚的看到,上图中CCicEvent:Wait进行了1次上下文切换, 将UI线程从533 ms的挂起的状态切换到运行状态

继续往New Thread Stack的上面看,从图中可以很清楚的看到,企点应用层调用了LoadKeyboardLayoutW方法,消耗了约0.54 s

找到源代码:

void functionA(INT id, Event* pEvent, Data* pData)
{
		...
		
		hkl=LoadKeyboardLayout(_T("0x0409"),KLF_ACTIVATE);
		if (hkl==NULL)
		{
			return ;
		}
		ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);
		HWND hWnd;	
		
		...
}		

通过分析得知,这部分代码是开关输入法,由于工作台拨号盘限制输入的类型为英文,所以在点击按钮时会调用LoadKeybordLayoutActivateKeyboardLayout装载并激活输入法,导致了UI上的卡顿。

定位原因后,解决方案:直接在输入法编辑状态过滤,避免开关输入法

五、总结

本文以一个案例介绍了如何分析客户端卡顿问题的思路和方法,另一方面,Windows性能问题除了UI卡顿外,还包括内存泄漏,磁盘读取等等,而UIforETW是一个十分强大的工具,对其他的windows性能问题也能够很好的支持,目前对它的了解只是冰山一角,还需要继续的探索和实践。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴裕超

防运营商劫持代码

运营商是指那些提供宽带服务的ISP,包括三大运营商中国电信、中国移动、中国联通,还有一些小运营商,比如长城宽带、歌华有线宽带。运营商提供最最基础的网络服务,掌握...

57930
来自专栏hadoop学习笔记

菜鸟如何使用hanlp做分词的过程记录

最近在学习hanlp的内容,准备在节后看看有没有时间整理一波hanlp分享下,应该还是会像之前分享DKHadoop一样的方式吧。把整个学习的过程中截图在配文字的...

13940
来自专栏Android群英传

Siri 帮我开灯

12420
来自专栏HaHack

comment.js:一个纯JS实现的静态站点评论系统

27440
来自专栏24K纯开源

Final Cut Pro X效果插件开发总结

一、介绍       最近公司需要针对Final Cut Pro(FCP)开发一款效果插件,用于对公司自己开发的视频格式进行后期处理。Final Cut Pro...

41580
来自专栏哲学驱动设计

“秒杀”心得

    本文记录对某网站A的秒杀活动编写秒杀器的经历和技术重点。 故事回顾     某日早上,朋友给我说最近A网站在开展秒杀活动,有IPad、IPhone,让大...

34080
来自专栏北京马哥教育

Linux 新手必会的21条命令合集

21770
来自专栏ytkah

保存一下dedecms数据库表和字段说明,方便日后查询

玩dedecms有一段时间,对它的字段不是很了解,在此做个记录,方便日后查询 dede数据库字段说明: dede_addonarticle 附加文章...

28440
来自专栏编程

Pycharm中一些不为人知的技巧

码个蛋第243次推文 作者:刘志军 工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,...

23180
来自专栏云瓣

用 Node.js 把玩一番 Alfred Workflow

作为 Mac 上常年位居神器榜第一位的软件来说,Alfred 给我们带来的便利是不言而喻的,其中 workflow(工作流) 功不可没,在它上面可以轻松地查找任...

46830

扫码关注云+社区

领取腾讯云代金券