Je m'intéresse actuellement au performance de QML en termes de temps d'exécution d'une fonction.

J'ai pris comme exemple le calcul du plus grand diviseur commun entre deux nombres.

Voici mon code QML :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import QtQuick 2.0
 
 
Item {
 
    function myTest(){
 
        function pgcd(a, b){
            return b ? pgcd(b, a % b) : a
        }
 
        for (var i=0; i<=10000000; i=i+1){
            pgcd(9078, 5118)
        }
 
        console.log("Fin du test i = ", i)
        return 0
    }
}
le code cpp me permettant d'exécuter le code QML:
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QApplication>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QQuickView>
 
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl("ex.qml"));
    QObject *object = component.create();
 
    QMetaObject::invokeMethod(object, "myTest", Qt::DirectConnection);
 
    delete object;
 
}

et sa variante en Python :
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
 
from PyQt5.QtCore import QCoreApplication, QUrl, QMetaObject, Qt
from PyQt5.QtQml import QQmlComponent, QQmlEngine
 
 
def fonction():
    app = QCoreApplication(sys.argv)
 
    engine = QQmlEngine()
 
    component = QQmlComponent(engine)
    component.loadUrl(QUrl('ex.qml'))
    test = component.create()
 
 
 
    QMetaObject.invokeMethod(test, "myTest", Qt.DirectConnection)
    del engine
 
 
fonction()


Je ne suis clairement pas un expert en C++ mais je suis assez étonné du résultat que j'obtiens à savoir :
  • code QML appelé via Python : environ 1.5sec ;
  • code QML appelé via C++ : environ 6.8sec ;


Ai-je mal fait quelque chose ? Quelqu'un pourrait-il me dire s'il obtient les mêmes résultats en particulier avec la version C++ ?

D'avance merci

++

J