测量Qt性能

我决定继续有关Aurora OS的系列文章(直到最近称为Sailfish)。 在使用此OS的过程中,我积累了与Qt和整个系统上的应用程序性能有关的各种观察结果,因为它与各种设备(如圣诞树)挂在一起,在启动时我会注意到所有的小细节。 我认为这对于同时使用Qt(或即将工作)的同事可能是有趣且有用的。 建议您可以进行更多测试。



我使用Qt编程,经常与同事,iOS开发人员讨论方法的异同和不同之处。 在某个时候,我们仍然决定从言传身教到行动。 我们没有找到愿意参与娱乐活动的Android程序员,因此仅将Swift和C ++与数字和表的参与进行比较。

我想提醒您,Qt / C ++并未强加其内存管理机制,用户自己可以在C ++可用功能的框架内解决此问题,而在Swift引用计数中以及在Java中使用垃圾回收器。 因此,程序员有机会更有效地与内存进行交互。 为了发送http请求或从数据库读取数据,Qt依靠自身的优势,不使用OS提供的现成框架。 例外-与键盘交互,绘制应用程序启动窗口,显示通知和其他内容。

测试1


首先,我们决定编写一个简单的算法(Eratosthenes的筛子),对它进行大量运算并比较计算时间。 在iPhone 7上推出。

Swift程序:

swift // // ViewController.swift // Eratosthenes // // Created by Dmitry Shadrin on 22/11/2018. // Copyright 2018 Digital Design. All rights reserved. // import UIKit class ViewController: UIViewController { @IBOutlet weak var digitTextField: UITextField! @IBOutlet weak var timeLabel: UILabel! @IBAction func startAction(_ sender: UIButton) { guard let text = digitTextField.text, let number = Int(text) else { return } prime(n: number) } func prime(n: Int) { let startTime = DispatchTime.now() let _ = PrimeSequence(upTo: n) .reduce(into: [], { $0.append($1) }) //      let endTime = DispatchTime.now() let time = (endTime.uptimeNanoseconds - startTime.uptimeNanoseconds) timeLabel.text = "\(time)" } } public struct PrimeSequence: Sequence { private let iterator: AnyIterator<Int> public init(upTo limit: Int) { self.iterator = AnyIterator(EratosthenesIterator(upTo: limit)) } public func makeIterator() -> AnyIterator<Int> { return iterator } } private struct EratosthenesIterator: IteratorProtocol { let n: Int var composite: [Bool] var current = 2 init(upTo n: Int) { self.n = n self.composite = [Bool](repeating: false, count: n + 1) } mutating func next() -> Int? { while current <= self.n { if !composite[current] { let prime = current for multiple in stride(from: current * current, through: self.n, by: current) { composite[multiple] = true } current += 1 return prime } current += 1 } return nil } } 


我不会详细讲解代码,线性Eratosthenes并不是很容易理解,特别是如果您不熟悉其中一种语言时。 这是带有描述的链接: https : //e-maxx.ru/algo/prime_sieve_linear ,有兴趣的人可以检查诚实。 顺便说一下,事实证明,迅捷版在一些小事情(您可以找到它们)上进行了一些优化,但这并不妨碍plus版赢得性能。

Qt程序:
 #include "eratosthenes.h" #include <stdio.h> #include <stdlib.h> #include <time.h> #include <QVector> #include <QDebug> #include <vector> #include <cmath> Eratosthenes::Eratosthenes(QObject *parent) { time = 0; } void Eratosthenes::qtFunction(int n) { clock_t start, end; start = clock(); std::vector<int> lp = std::vector<int>(n + 1, 0); std::vector<int> pr; //       pr.reserve(std::sqrt(n) / 2); for (int i = 2; i <= n; ++i) { if (lp[i] == 0) { lp[i] = i; pr.emplace_back(i); } for (int j = 0; j < pr.size() && pr[j] <= lp[i] && i * pr[j] <= n; ++j) { lp[i * pr[j]] = pr[j]; } } end = clock(); time = (end - start) / (double)CLOCKS_PER_SEC; pTimeChanged(); qDebug() << "  " << pr.size() << "" << time; } 

运行程序。 应用程序具有一个用于输入数字n的字段,一个开始按钮和一个具有总时间的字段:


Swift-在左侧,Qt-在右侧。

结果。 我将给出一张针对不同n和不同时间点的测量表:

如您所见,C ++应用程序比具有相同算法的本机应用程序快约1.5倍。

测试2


自然地,在移动应用程序上下文中进行计算是一件重要的事情,但远非唯一。 因此,为了绘制图形元素的速度,我们绘制了一个由1000个元素组成的ListView,每个元素包含文本和图片。 在下面的视频中,您可以看到结果:

Qt:

斯威夫特:


在视觉上,差异并不明显。

测试3


在Sailfish操作系统中,我们在Qt上具有Linux内核和图形本机外壳,这本身就暗示了对该操作系统的良好性能的想法。 我经常注意到Inoi R7在某些任务的速度方面胜出,尽管三星Galaxy S8也是如此。 因此,例如,三星Galaxy S8发送,接收,处理,打包到数据库等。 10K http请求大约需要3-4分钟,而Inoi R7会在5-6分钟内执行相同的操作。 考虑到铁性能的差异,结果令人印象深刻。

为了更诚实地测试OS性能,我决定查看独轮车的响应速度。

Test.cpp:


 #include "mypainter.h" #include <QPainter> MyPainter::MyPainter(QQuickItem *parent) : QQuickPaintedItem(parent) { } void MyPainter::paint(QPainter *painter) { QPen pen; pen.setWidth(10); pen.setColor(Qt::red); painter->setPen(pen); painter->drawPolyline(pol); } void MyPainter::xyCanged(int x, int y) { pol.append(QPoint(x, y)); update(); } 

Test.qml:


 import QtQuick 2.9 import QtQuick.Window 2.2 import Painter 1.0 Window { visible: true Painter { id: painter anchors.fill: parent MouseArea { anchors.fill: parent onPressed: { painter.xyCanged(mouseX, mouseY) } onMouseXChanged: { painter.xyCanged(mouseX, mouseY) } onMouseYChanged: { painter.xyCanged(mouseX, mouseY) } } } } 

简单而朴实。 我没有支持个人使用Sailfish和Android的手机,所以我不得不看我的同事寻找一款尽可能与Inoi r7接近但在Android上使用的手机。 考虑到我坐在移动开发办公室,这突然变得非常困难。

索尼Xperia Z5紧凑型:
处理器-高通Snapdragon 810 MSM8994,2000 MHz
处理器核心数-8
视频处理器-Adreno 430
内存容量-32 GB
RAM量-2 GB

Inoi R7:
处理器-Qualcomm Snapdragon 212 MSM8909AA,1200 MHz
处理器核心数-4
视频处理器-Adreno 304
内存容量-16 GB
RAM量-2 GB

索尼的功能更加强大,但是对于赔率方程式,我们打开了其节能模式,即使如此,也不会导致设备功率的完全相等。 在视频上,您可以看到在Android上,线条不如Sailfish上的平滑。

左-索尼,右-Inoi:



我不认为这不是一个很严重的指标,您不仅需要比较纯语言的功能,还需要比较本机和跨平台的不同库,以比较它们的性能和易用性,因为很少有应用程序仅使用ListView和Eratosthenes筛子。 尽管所有这些小事情在一起对我来说都非常令人信服。

缺点


当然,Qt并不是一切都那么美好,因为我尝试在此处进行绘制时,存在弊端。 例如,在Android上使用TextInput时,您可能会折磨对拐杖特别敏感的完美主义者,因为Qt在与键盘进行交互时,在每台设备上都设法将绝对独特的摇杆放在转轮上。 在一部手机上,图片升起,在另一部手机上,图片静止不动,但EnterKey不起作用;在第三部手机上,始终仅输入大写字母,无法说服它切换为小写字母。 您可以无限进行。 所有这一切也放慢了速度! (Grunt仅与Android相关,Sailfish没有此类问题,一切正常)。 另外,在Qt上,很难获得应用程序的本机外观。

结论


可以得出的主要结论是:Qt是一种跨平台的工具,其性能并不比本地开发工具差。 它非常适合其中除了GUI之外还有很多数学的程序,特别是对于企业应用程序而言,其中存在许多细微差别且员工人数很少,因此不必为每个OS创建一个独立的版本。 对于公司用户而言,功能比本机UI更重要。 对于Aurora,Qt是用于应用程序开发的本机工具,它可能会带来其他一些性能提升。

在功能强大的硬件(例如Galaxy S8)上测试Aurora会很有趣。

Source: https://habr.com/ru/post/zh-CN457622/


All Articles