قررت الاستمرار في سلسلة المقالات حول نظام التشغيل Aurora OS (حتى وقت قريب يسمى Sailfish). خلال الوقت الذي أعمل فيه مع نظام التشغيل هذا ، قمت بتجميع العديد من الملاحظات المتعلقة بأداء التطبيقات على Qt والنظام ككل ، لأنه معلق مع مجموعة متنوعة من الأجهزة ، مثل شجرة عيد الميلاد ، ألاحظ كل الأشياء الصغيرة عند بدء التشغيل. أعتقد أن هذا يمكن أن يكون مثيراً للاهتمام ومفيد للزملاء الذين يعملون أيضًا مع Qt (أو سيعملون قريبًا). أقترح أنه يمكنك اختبار أكثر.

أقوم بالبرمجة في Qt وغالبًا ما أناقش مع الزملاء ومطوري iOS وأوجه التشابه والاختلاف وفوائد النهج. في مرحلة ما ، قررنا الانتقال من الأقوال إلى الأفعال وإجراء القياسات. لم نعثر على مبرمج Android كان مستعدًا للمشاركة في الترفيه لدينا ، لذلك ستكون المقارنة بمشاركة الأرقام والجداول فقط لـ Swift و C ++.
أريد أن أذكرك بأن Qt / C ++ لا تفرض آلية إدارة الذاكرة الخاصة به ، وأن المستخدم نفسه يحل هذه المشكلة في إطار الإمكانيات المتاحة في C ++ ، بينما يتم استخدام عد مرجع Swift ، وفي Java يعد أداة تجميع مجمعي البيانات المهملة. وبالتالي ، فإن مبرمج لديه فرصة للتفاعل مع الذاكرة بشكل أكثر كفاءة. من أجل إرسال طلب http أو قراءة البيانات من قاعدة بيانات ، تعتمد Qt على نقاط القوة الخاصة بها ، ولا تستخدم أطر عمل جاهزة يوفرها نظام التشغيل. استثناءات - التفاعل مع لوحة المفاتيح ورسم نافذة بدء التطبيق وعرض الإشعارات وأشياء أخرى.
اختبار 1
بادئ ذي بدء ، قررنا كتابة خوارزمية بسيطة (غربال إراتوستينس) ، وتشغيلها على أعداد كبيرة ومقارنة وقت الحساب. تم إطلاقه على iPhone 7.
برنامج سويفت:swift
لن أتطرق إلى الكود بالتفصيل ، ليس من الواضح فهم إراتوستينس الخطي ، خاصة إذا كانت إحدى اللغات غير مألوفة بالنسبة لك. هنا رابط مع وصف:
https://e-maxx.ru/algo/prime_sieve_linear ، المهتمين ، يمكن التحقق من الصدق. بالمناسبة ، اتضح أن الإصدار السريع كان أفضل قليلاً في الأشياء الصغيرة (يمكنك البحث عنها) ، الأمر الذي لم يمنع إصدار الإضافة من الفوز بالأداء.
برنامج كيو تي: #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 وزر البدء وحقل بوقت إجمالي:

سويفت - على اليسار ، كيو تي - على اليمين.نتيجة. سأقدم جدولًا للقياسات لنقط مختلفة وفي نقاط زمنية مختلفة:

كما ترون ، يكون تطبيق C ++ أسرع بمقدار 1.5 مرة من التطبيق الأصلي مع خوارزميات متطابقة.
اختبار 2
بطبيعة الحال ، تعد الحوسبة في سياق التطبيقات المحمولة أمرًا مهمًا ، ولكنها بعيدة عن الشيء الوحيد. لذلك ، قمنا برسم قائمة عرض تتكون من 1000 عنصر ، يحتوي كل منها على نص وصورة ، من أجل النظر في سرعة تقديم عناصر الرسوم. أدناه ، في مقاطع الفيديو ، يمكنك رؤية النتيجة:
كيو تي:
سويفت:
بصريا ، والفرق ليس ملحوظا.
اختبار 3
في Sailfish OS ، لدينا نواة Linux وقذيفة أصلية رسومية على Qt ، وهذا في حد ذاته يوحي بأفكار حول الأداء الجيد لنظام التشغيل هذا. كثيراً ما ألاحظ أن جهاز Inoi R7 يفوز من حيث سرعة بعض المهام ، على الرغم من أن Samsung Galaxy S8 يفعل نفس الشيء. لذا ، على سبيل المثال ، يرسل Samsung Galaxy S8 ، ويستقبل ، ويعالج ، حزم في قاعدة بيانات ، إلخ. 10K طلبات HTTP في حوالي 3-4 دقائق ، و Inoi R7 يفعل الشيء نفسه لمدة 5-6 دقائق. بالنظر إلى الفرق في أداء الحديد ، فإن النتيجة رائعة.
لإجراء اختبار أكثر صدقًا لأداء نظام التشغيل ، قررت إلقاء نظرة على سرعة استجابة عربة اليد.
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. الأمر الذي أصبح فجأة أمرًا صعبًا للغاية ، مع الأخذ في الاعتبار أنني جالس في مكتب لتطوير الأجهزة المحمولة.
سوني اريكسون Z5 المدمجة:
المعالج - كوالكوم أنف العجل 810 MSM8994 ، 2000 ميجا هرتز
عدد النوى المعالج - 8
معالج فيديو - Adreno 430
مقدار الذاكرة الداخلية - 32 جيجابايت
مقدار ذاكرة الوصول العشوائي - 2 جيجابايتInoi R7:
المعالج - كوالكوم Snapdragon 212 MSM8909AA ، 1200 ميغاهيرتز
عدد النوى المعالج - 4
معالج فيديو - Adreno 304
مقدار الذاكرة الداخلية - 16 جيجابايت
مقدار ذاكرة الوصول العشوائي - 2 جيجابايتومع ذلك ، تبين أن Sony أقوى ، ولكن بالنسبة لمعادلة الاحتمالات ، فإننا نستخدم وضع توفير الطاقة عليه ، ولكن لن يؤدي كل ذلك إلى المساواة الكاملة في قوة الأجهزة. في الفيديو ، يمكنك رؤية أن الخط على نظام Android ليس سلسًا مثل Sailfish.
يسار - سوني ، يمين - Inoi:
أنا لا أجادل ، هذا ليس مؤشرًا خطيرًا جدًا ، فأنت بحاجة إلى مقارنة ليس فقط قدرات اللغة البحتة ، ولكن أيضًا المكتبات المختلفة ، الأصلية والمتعددة المنصات ، لمقارنة أدائها وسهولة استخدامها ، نظرًا لوجود عدد قليل جدًا من التطبيقات التي تستخدم ListView و غربال Eratosthenes فقط. رغم أن كل هذه الأشياء الصغيرة تبدو مقنعة للغاية بالنسبة لي.
سلبيات
بالطبع ، ليس كل شيء وردية للغاية مع كيو تي ، حيث أحاول أن أرسم هنا ، هناك سلبيات. على سبيل المثال ، من خلال العمل مع TextInput على نظام Android ، يمكنك تعذيب ممارسي الكمال الذين لديهم حساسية خاصة للعكازات ، لأن Qt قادر على وضع كل عصي فريدة على العجلات عند التفاعل مع لوحة المفاتيح. على أحد الهواتف ، ترتفع الصورة ، ومن ناحية أخرى تظل ثابتة ، لكن EnterKey لا تعمل ، حيث يتم دائمًا إدخال الأحرف الكبيرة فقط ، ولا توجد طريقة لإقناعها بالانتقال إلى الأحرف الصغيرة. يمكنك الذهاب إلى ما لا نهاية الإعلان. وكل هذا يبطئ أيضا! (همهمات ذات صلة فقط بنظام Android ، لا توجد مثل هذه المشكلات على Sailfish ، كل شيء يعمل بشكل جيد). بالإضافة إلى ذلك ، في كيو تي من الصعب تحقيق المظهر الأصلي للتطبيق.
استنتاج
الاستنتاج الرئيسي الذي يمكن استخلاصه: كيو تي ، كونه أداة متعددة المنصات ، ليس أدنى مستوى من الأداء في أدوات التنمية المحلية. إنه مثالي للبرامج التي ، بالإضافة إلى واجهة المستخدم الرسومية ، لا يزال هناك الكثير من الرياضيات ، وخاصة لتطبيقات المؤسسات ، حيث يوجد العديد من الفروق الدقيقة وعدد قليل من الموظفين ، حتى لا يتم إنشاء نسخة مستقلة لكل نظام تشغيل. وظائف هي أكثر أهمية لمستخدمي الشركات من واجهة المستخدم الأصلية. بالنسبة إلى Aurora ، تعد Qt أداة أصلية لتطوير التطبيقات ، والتي من المحتمل أن تعطي بعض الأداء الآخر.
سيكون من المثير للاهتمام اختبار جهاز Aurora على أجهزة قوية مثل جهاز Galaxy S8.