Mengukur Kinerja Qt

Saya memutuskan untuk melanjutkan serangkaian artikel tentang Aurora OS (sampai saat ini disebut Sailfish). Selama saya bekerja dengan OS ini, saya telah mengumpulkan berbagai pengamatan yang berhubungan dengan kinerja aplikasi pada Qt dan sistem secara keseluruhan, karena digantung dengan berbagai perangkat, seperti pohon Natal, saya perhatikan semua hal kecil saat startup. Saya pikir ini bisa menarik dan bermanfaat bagi kolega yang juga bekerja dengan Qt (atau akan segera bekerja). Sarankan agar Anda dapat menguji lebih banyak.



Saya memprogram di Qt dan sering berdiskusi dengan kolega, pengembang iOS, persamaan, perbedaan, dan manfaat dari pendekatan. Pada titik tertentu, kami masih memutuskan untuk beralih dari kata-kata ke perbuatan dan melakukan pengukuran. Kami tidak menemukan programmer Android yang siap berpartisipasi dalam hiburan kami, jadi perbandingan dengan partisipasi angka dan tabel hanya untuk Swift dan C ++.

Saya ingin mengingatkan Anda bahwa Qt / C ++ tidak memaksakan mekanisme manajemen memorinya, dan pengguna sendiri memecahkan masalah ini dalam kerangka kemampuan yang tersedia di C ++, sementara Swift menggunakan penghitungan referensi, dan di Jawa menggunakan pengumpul sampah. Dengan demikian, programmer memiliki kesempatan untuk berinteraksi dengan memori secara lebih efisien. Untuk mengirim permintaan http atau membaca data dari database, Qt mengandalkan kekuatannya sendiri, dan tidak menggunakan kerangka kerja siap pakai yang disediakan oleh OS. Pengecualian - interaksi dengan keyboard, menggambar jendela mulai aplikasi, menampilkan pemberitahuan dan hal-hal lain.

Tes 1


Pertama-tama, kami memutuskan untuk menulis algoritma sederhana (ayakan Eratosthenes), menjalankannya dalam jumlah besar dan membandingkan waktu perhitungan. Diluncurkan pada iPhone 7.

Program cepat:

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 } } 


Saya tidak akan membahas kode secara rinci, Eratosthenes linier tidak jelas untuk dipahami, terutama jika salah satu bahasa tidak Anda kenal. Berikut ini tautan dengan deskripsi: https://e-maxx.ru/algo/prime_sieve_linear , yang tertarik, dapat memeriksa kejujurannya. By the way, versi cepat ternyata sedikit lebih dioptimalkan dalam hal-hal kecil (Anda dapat mencarinya), yang tidak mencegah versi plus dari memenangkan kinerja.

Program 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; } 

Jalankan programnya. Aplikasi memiliki bidang untuk memasukkan angka n, tombol mulai dan bidang dengan total waktu:


Swift - di sebelah kiri, Qt - di sebelah kanan.

Hasil. Saya akan memberikan tabel pengukuran untuk n yang berbeda dan pada titik waktu yang berbeda:

Seperti yang Anda lihat, aplikasi C ++ ~ 1,5 kali lebih cepat daripada yang asli dengan algoritma yang identik.

Tes 2


Secara alami, komputasi dalam konteks aplikasi mobile adalah hal yang penting, tetapi jauh dari itu. Oleh karena itu, kami membuat ListView yang terdiri dari 1000 elemen, yang masing-masing berisi teks dan gambar, untuk melihat kecepatan rendering elemen grafis. Di bawah, di video, Anda dapat melihat hasilnya:

Qt:

Cepat:


Secara visual, perbedaannya tidak terlihat.

Tes 3


Di Sailfish OS, kami memiliki kernel Linux dan shell asli grafis pada Qt, dan ini dengan sendirinya menunjukkan pemikiran tentang kinerja yang baik dari OS ini. Saya sering memperhatikan bahwa Inoi R7 menang dalam hal kecepatan beberapa tugas, meskipun Samsung Galaxy S8 melakukan hal yang sama. Jadi, misalnya, Samsung Galaxy S8 mengirim, menerima, memproses, mengemas ke dalam basis data, dll. Permintaan 10K http dalam waktu sekitar 3-4 menit, dan Inoi R7 melakukan hal yang sama selama 5-6 menit. Mengingat perbedaan dalam kinerja besi, hasilnya sangat mengesankan.

Untuk pengujian kinerja OS yang lebih jujur, saya memutuskan untuk melihat kecepatan respons gerobak.

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) } } } } 

Sederhana dan bersahaja. Saya tidak memiliki telepon yang mendukung Sailfish dan Android untuk penggunaan pribadi, jadi saya harus melihat rekan kerja saya untuk telepon yang sedekat mungkin dengan Inoi r7, tetapi di Android. Yang tiba-tiba menjadi sangat sulit, mengingat saya sedang duduk di kantor pengembangan ponsel.

Sony Xperia Z5 compact:
Prosesor - Qualcomm Snapdragon 810 MSM8994, 2000 MHz
Jumlah inti prosesor - 8
Pemroses Video - Adreno 430
Jumlah memori internal - 32 GB
Jumlah RAM - 2 GB

Inoi R7:
Prosesor - Qualcomm Snapdragon 212 MSM8909AA, 1200 MHz
Jumlah inti prosesor - 4
Pemroses Video - Adreno 304
Jumlah memori internal - 16 GB
Jumlah RAM - 2 GB

Meskipun demikian Sony ternyata lebih kuat, tetapi untuk persamaan peluang kami mengaktifkan mode hemat daya di atasnya, semua itu tidak akan menyebabkan kesetaraan penuh kekuatan perangkat. Pada video Anda dapat melihat bahwa di Android salurannya tidak semulus di Sailfish.

Kiri - Sony, kanan - Inoi:



Saya tidak berpendapat, ini bukan indikator yang sangat serius, Anda perlu membandingkan tidak hanya kemampuan bahasa murni, tetapi juga perpustakaan yang berbeda, asli dan lintas platform, untuk membandingkan kinerja dan kemudahan penggunaan, karena ada sangat sedikit aplikasi yang hanya menggunakan ListView dan saringan Eratosthenes. Meskipun semua hal-hal kecil ini bersama-sama terlihat sangat meyakinkan bagi saya.

Cons


Tentu saja, semuanya tidak begitu cerah dengan Qt, ketika saya mencoba melukis di sini, ada kontra. Misalnya, bekerja dengan TextInput di Android, Anda dapat menyiksa perfeksionis yang sangat sensitif terhadap kruk, karena pada setiap perangkat Qt berhasil menempatkan tongkat yang benar-benar unik di roda ketika berinteraksi dengan keyboard. Di satu ponsel, gambar naik, di lain berdiri, tetapi EnterKey tidak berfungsi, di ketiga, hanya huruf besar yang selalu dimasukkan, dan tidak ada cara untuk meyakinkannya untuk beralih ke huruf kecil. Anda dapat menggunakan ad infinitum. Dan semua ini juga melambat! (Grunts hanya relevan untuk Android, tidak ada masalah pada Sailfish, semuanya berfungsi dengan baik). Selain itu, pada Qt sulit untuk mencapai tampilan asli aplikasi.

Kesimpulan


Kesimpulan utama yang dapat ditarik: Qt, sebagai alat lintas platform, tidak kalah dalam kinerjanya dengan alat pengembangan asli. Ini sempurna untuk program-program di mana, selain GUI, masih ada banyak matematika, dan terutama untuk aplikasi perusahaan, di mana ada banyak nuansa dan beberapa karyawan, sehingga tidak membuat versi independen untuk setiap OS. Fungsi lebih penting bagi pengguna korporat daripada UI asli. Untuk Aurora, Qt adalah alat asli untuk pengembangan aplikasi, yang mungkin memberikan beberapa peningkatan kinerja lainnya.

Akan menarik untuk menguji Aurora pada perangkat keras yang kuat seperti Galaxy S8 saya.

Source: https://habr.com/ru/post/id457622/


All Articles