Qt:通过QMLProfiler分析程序性能问题
对于⼀个程序的开发,性能优化是开发中的⼀个重要步骤。
我们肯定不希望开发出来的程序表现出卡顿,最好是处处流畅,丝滑般的体验。
对于C++程序,我们有很多⽅法可以做性能优化,例如Visual Studio Profiler。
香皂洗脸好吗
⽽对于QML(QtQuick)程序,我们可以选择QML Profiler,这是QtCreator的⼀个功能。
那么QML Profiler是什么呢,官⽅的描述如下:
You can u the QML Profiler to find caus for typical performance problems in your applications, such as slowness and unresponsive, stuttering ur inte 也就是说,QML Profiler主要功能就是帮助我们去解决程序中典型的性能问题,说简单就是帮助我们做性能优化。
注意:这个性能优化,仅指QML这⾥,⼀般来说就是界⾯,可能还包含点界⾯逻辑代码(JS),⽽C++这块,QML Profiler⼏乎帮不上插齿加工
忙,最多是能给在QML中调⽤的槽函数记个耗时。
注意2:使⽤QML Profiler是优化QtQuick性能的基本功,之后我会再发⼏篇和QtQuick性能优化相关的⽂章,⾥⾯都会⽤到QML
Profiler。本⽂只介绍QML Profiler,尽量不涉及具体的优化点。
正⽂开始:
借助于QML Profiler,我们快速的了解程序运⾏中的主要情况和耗时细则(可以精确到微秒),其中包括但不限于:图⽚缓存使⽤情况
渲染耗时
内存使⽤情况
输⼊事件
动画帧率
编译耗时
创建耗时
绑定耗时
信号处理耗时
JS代码耗时
那么对于QML Profiler这样的⼯具,使⽤起来是否⾮常复杂呢?
答案是:使⽤⾮常⽅便,甚⾄不需要额外的配置,连很多分析都是可视化的。使⽤步骤如下:
准备Qt环境,我建议是Qt5.7或者更⾼版本。这是因为以前QML Profiler结果中很多数据是企业版的QtCreator才看得到的,有的数据⾮常重要,例如渲染的耗时。后来才向开源版开放。是5.6还是5.7有点记不清了,我⽤的是Qt5.8.0配合QtCreator4.2.1。
打开QtCreator
打开⼀个QML(QtQuick)⼯程,我这⾥使⽤的是默认的⼯程
选择debug模式
在QtCreator上边菜单中选择 Analyze 中的 QML 分析器
靓丽的风景线
等待程序运⾏起来,并且运⾏⼀段时间
图形拼贴画在QtCreator左边菜单中选择 Debug ,然后点击 Stop 按钮,停⽌QMLProfiler,并且开始处理数据
射雕英雄传歌曲
⾄此,QML Profiler应当已经成功运⾏,并且收集到了数据,如图。
图中,我们可以看到如下⼏个主要的数据区:时间轴视图
统计信息视图
⽕焰视图
分别介绍⼀下3个视图
时间轴视图
在这⾥,我们可以以时间轴⾓度,查看各个细节的耗时。时间轴的起点,就是QQmlApplication实例化的时间。我们可能看不到零点,因为在QQmlApplication被实例化到第⼀个元素被开始处理,时间可能会有其他的耗时。
在视图中,从左到右,就是QML Profiler从开始到停⽌的所有记录了。越⼩的块表⽰时间越短,反之越⼤的块,表⽰时间越长。这⾥的⽅块具有⼀定的嵌套关系,下⾯的⽅块对象⾪属于上⾯的对象。⽐如说 Windows { } ⾥⾯还可能会有⼀个 Item { } 这样的嵌套关系。
如果在你的程序中,发现⼀个⾮常巨⼤的块,那么恭喜你,你可能已经找到了程序性能卡顿的所在。之后就是分析和优化了。
例如上⾯截图中的数据,我们发现TextEdit的创建⾮常耗时,创建⽅块(蓝⾊那个)⾮常⼤,⼏乎已
经是⼀⼤半的时间都消耗在这⾥了。这也是导致了程序在启动时,⽐较慢(⾄少没有⼀瞬间起来)的罪魁祸⾸。
⽬前我知道这个是程序第⼀个⽤到字的地⽅(Text、TextEdit等),就会有这么慢,有这么⼏百毫秒,可能是在加载字体库?但是这个现象我⽬前只在macOS系统上看到,没有什么代表性。所以,我们暂时跳过这个不管他。
我这⾥略讲下时间轴视图的常⽤操作:
详细信息查看
飞行员英文通过点击⾊块,我们可以得知这个⾊块的基本信息,例如下图中:
我们可以在这⾥看出这个时间开销是来⾃于TextEdit的创建,总共耗时了580毫秒,使⽤到这个TextEdit的地⽅是MainForm.ui.qml的15⾏。打开源码,可以看到确实在这⾥。
根据事件类型展开
在左侧不同类型的事件中,我们可以点击那个展开按钮,这样我们就可以看到展开的详细数据,这样看数据对应关系时会更加的清楚,但是当数据很多的时候也会更加的凌乱,所以酌情使⽤。
鸡血紫檀
缩放按钮
在左侧有⼀个放⼤镜,可以缩放视图的⽐例,这对于分析⼀段⽐较长的QML Profiler或者想看某⼀个细节点的数据会⾮常有⽤
古代关于信的故事统计信息视图