Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进
我們一直致力于提高Qt的性能和優化其內存消耗。Qt 5.12的一個重點關注是在于減少QML引擎的內存消耗和優化JavaScript性能。
與上一個長期支持版Qt 5.6 LTS相比,Qt 5.9 LTS總體性能已經發生了明顯改善。這都在一篇博客中進行了總結,它在64-bit ARM基礎上分析了Qt 5.9 LTS版本中的Qt Quick 性能提升。在Qt 5.12 LTS中,我們更深入研究了QML引擎、內存消耗和JavaScript性能,并進一步調整和優化這些內容。
QML內存使用
應用程序中的各個部分都會消耗內存,要總體優化內存的使用,一般來說是通過縮減圖形素材,優化元件(實例、素材)的使用時機、使用Qt Lite來裁剪掉不用的功能以及利用其它的內存優化技術等。由于應用開發者很難控制QML引擎本身的內存消耗,因此我們深入研究了如何減少其內存消耗。
Qt 5.12 LTS的一個重要優化是在于和編譯后QML一起使用的數據結構。QML引擎在運行加載 .qml或 .js文件時,會動態創建緩存文件(名為 .qmlc和 .jsc),其中就包含動態dump的內部數據結構。啟動時如果找到這些文件,則將這些文件加載到應用程序進程中,并直接使用,而不需要編譯過程。我們可以選擇在編譯應用程序時提前創建這些緩存文件。在這種情況下,我們對類型系統的能見性不如QML引擎動態解析時那么高。這會導致分階段處理的方式,因為我們不能像運行時動態生成數據結構那樣解析內容,這就要求我們在預生成的緩存文件之上做一些額外的處理。
在Qt 5.12 LTS中,為了減少使用這些預編譯緩存文件時的內存消耗,實施了兩個改進:
1.避免為內存中生成的編譯單元重新創建索引字符串表,而是返回從緩存文件中提供的內存映射字符串表。
2.減少數據結構的大小,以減少文件的大小和它們的內存消耗。
除了上面描述的改進之外,我們還做了多項較小的改進,以減少QML引擎的內存消耗,同時仍然保持良好的性能(實際上在其他一些方面也有許多改進)。
Qt Quick Application的實際內存使用在很大程度上取決于應用程序本身。在下面的比較圖中,我們測量了兩個不同應用程序中與QML引擎有關的內存消耗。我們使用Qt Quick Controls示例來代表Qt Quick應用程序。
示例應用程序中,我們可以看到Qt 5.6.3使用36.3 MB內存,Qt 5.9.7使用18.5 MB內存,Qt 5.12 Beta使用13.0MB 內存(使用預編譯的QML)。這意味著Qt 5.12的內存使用率比Qt 5.9低30%,比Qt 5.6的示例應用程序低64%。所有的Qt用戶都可以從這些內存節省中收益。對于商業用戶,Qt 5.6和5.9提供了一個單獨的可以預編譯QML的工具Qt Quick Compiler。使用Qt Quick Compiler,Qt 5.6的內存使用量下降到14.4MB(比不使用它時的內存使用量低60%)。因此,即使在Qt 5.6環境下使用 Qt Quick Compiler,升級到Qt5.12也會使內存使用達到10%的驚人改善。
由于應用程序各不相同,所以最好先檢查一下升級后對應用程序的提升有多大。我們基于一個相當復雜的實際Qt Quick應用程序,對QML引擎在Qt 5.6和5.9中使用Qt Quick Compiler和Qt 5.12使用預編譯QML條件下的內存使用情況作比較。在這次測試中,Qt 5.9使用的RAM比Qt 5.6少1.1MB(都使用了Qt Quick Compiler),而Qt 5.12使用量比Qt 5.6(使用Qt Quick Compiler)少了驚人的9.8MB。特別是對于資源受限的嵌入式系統或運行多個應用程序的嵌入式系統,QML引擎節省的RAM (在不更改應用程序代碼前提下)非常有價值。
JavaScript性能
與Qt 5.9 LTS和Qt 5.6 LTS相比,Qt 5.12 LTS的一個主要區別是從Qt 5.11開始在QML引擎中加入的全新編譯器體系結構。新版管道中還啟用了一些前文描述的內存優化。即使在Qt 5.12中增加了ECMAScript 7支持,新版管道中的JavaScript性能也有了顯著提高。
為了比較不同Qt版本的JavaScript性能,我們使用Qt 5.6.3、Qt 5.9.7和Qt 5.12 Beta運行了相同的JavaScript基準測試。 基準測試在64位ARM處理器上運行,使用Linux操作系統。
為了突出Qt 5.9到5.12的改進,我們將Qt 5.6測試結果進行了歸一化。
Qt 5.9相對于Qt 5.6的總改善率(總得分)為1785%而Qt 5.12與Qt 5.6相比,改善率為2187%。與Qt 5.6相比,最大的性能改進是因為在64位ARMv 8架構上支持了JIT,這可以在許多現代嵌入式處理器中使用。在Qt 5.6中,64位ARM不支持JIT。
Qt 5.9和Qt 5.12都支持JIT,因此這兩者之間的提升主要是由于新的編譯器架構。與Qt 5.9相比,Qt 5.12的JavaScript整體性能提高了21%。
Qt Quick整體性能
因為性能很容易受到各種影響,所以我們會定期運行幾種不同類型的性能測試。這些測試還有助于分析各種優化在不同平臺上的效果,并確保新特性和錯誤補丁不會無意間對性能產生副作用。其中一些結果可以在testresults.qt.io中看到,例如QML Bench 測試。
為了比較Qt版本的影響,我使用Qt 5.6.3、Qt 5.9.7和Qt 5.12 Beta運行了完整的QML Bench 中的測試集合。為了提高結果的可對比性,我們在Qt5.6上運行Qt Quick Controls 1測試,因為它沒有Qt Quick Controls 2。除此之外,QML Bench的功能在這些Qt版本之間是相同的。QML Bench是運行在Nvidia Jetson TX1開發板(64位ARM處理器)上,操作系統是Nvidia定制支持的Tegra Ubuntu 16.04的Linux 。
由于JavaScript和Qt Quick Controls的性能有了很大的提高,我們已經分別介紹了這些特性(前文描述的JavaScript和早期的博客中的Qt Quick Controls)。我們再次將Qt 5.6.3的結果完全進行了歸一化,以便更好地突出Qt 5.9和Qt 5.12的改進。
Qt 5.9與Qt 5.6相比,Qt 5.9經QML Bench測試后,其總體性能提高了一倍(比Qt 5.6提高了109%),Qt 5.12的性能達到了同樣的水平(98%優于Qt 5.6)。除了JavaScript和Qt Quick Control之外,其他方面的改進都比較小,通常在15%到25%之間。比較Qt 5.9和Qt 5.12對比測試的圖像結果可以看出更多的東西來。雖然Qt 5.12在某些方面性能更好,但我們也看到了一些測試用例中的性能回退。在接下來的幾個月里,我們將更仔細地研究這些繪圖,并希望在Qt 5.12版本的補丁上有所改進。
請注意,QML Bench并不直接代表實際應用程序的性能。每個應用程序使用不同的QML函數,通常多次使用。另一方面,QML Bench使用所有的功能都是相當平等的,并不根據實際使用的頻率來衡量結果-所以建議您通過自己的應用程序收集性能數據,看看它的性能提高了多少。
其他的改進
在這篇文章中,我們的重點放在Qt Quick 性能上,與Qt 5.12 LTS的早期版本相比,我們在三個重要方面有了顯著的改進:
1.QML內存使用情況
2.Qt Quick 總體性能
3.JavaScript性能
除此之外,Qt 5.12 LTS還提供了許多其他性能改進。Qt 5.12 LTS的一個重要改進是使用預先生成的字體距離屬性的可能性。早期的Qt已經在應用程序啟動期間創建了字體距離,它會消耗大量的CPU資源,特別是對于非拉丁字體(有許多符號)和復雜的拉丁字體(有很多不同的形狀)。在Qt 5.12 LTS中,我們發布了一個名為“Qt Distance Field Generator”的工具,它允許您為字體中的選定字形或所有字形預生成字體距離屬性。
我們一直在改進性能的其他領域包括,例如Qt 3D的CPU消耗和Qt 3D的內存消耗(對Qt 3D Studio應用程序特別有利)。Qt 5.12 LTS還引入了一個完全重新設計的TableView,它大幅提升了大型表格控件的性能,與Qt Quick Controls 1中原有的TableView完全不可同日而語。當然,QT5.12LTS還得益于Qt5.10引入的壓縮紋理支持和Qt 5.11的改進,以及自上一次Qt發布以來所做的多項其它改進。
Qt 5.12 LTS目前正處于Beta階段,我們正在努力在11月底發布Qt 5.12.0版本。如果您還不知道Qt 5.12 LTS,請使用它試試吧。
本文轉載自:http://blog.qt.io/cn/2018/12/03/qt-quick-performance-improvements-qt-5-12-lts/
總結
以上是生活随笔為你收集整理的Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QML 性能优化建议(一)
- 下一篇: Qt for ios 设置程序图标(l