C# GUI-Performance VS. Qt GUI-Performance

Alles rund um die Programmierung mit Qt
Antworten
PsyPath
Beiträge: 2
Registriert: 2. Juni 2014 00:54

C# GUI-Performance VS. Qt GUI-Performance

Beitrag von PsyPath »

Hallo zusammen,

ich habe ein kleines Programm sowohl in C#, als auch in Qt geschrieben. Das Programm vergleicht die GUI-Performance der beiden "Sprachen". Das Qt-Programm scheint kaum mit der Belastung fertig zu werden und muss letzten Endes mit dem Taskmanager gekillt werden. Das C#-Programm-Fenster kann ich bewegen wie ich möchte und kann das Programm zum Schluss auch mit einem Klick auf das X beenden. Mache ich in Qt irgendetwas falsch, oder ist die GUI-Performance echt so schlecht?

Bitte keinen Fragen, warum ich so etwas brauche. Ich kann an dieser Stelle keine Konsole nehmen, weil auch noch andere Controls zum Einsatz kommen.

Nachfolgend der Quellcode:

C#-Programm:
Form1.cs

Code: Alles auswählen

using System;
using System.Threading;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            Thread lMyThread = new Thread(MyThread);
            lMyThread.Start();
        }

        private void MyThread()
        {
            while (true)
            {
                Invoke((MethodInvoker)(() => richTextBox1.AppendText("Foo" + Environment.NewLine)));
            }
        }

        private void Form1_FormClosing(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }
    }
}
Qt-Programm:
Ausschnitt OutputWindow.cpp

Code: Alles auswählen

void OutputWindow::on_pushButton_clicked()
{
    ui->pushButton->setVisible(false);

    MyThread* lMyThread = new MyThread(ui->textEdit);
    connect(lMyThread, SIGNAL(finished()), lMyThread, SLOT(deleteLater()));
    lMyThread->start();
}
MyThread.h

Code: Alles auswählen

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QtCore>
#include <QThread>
#include <QTextEdit>

class MyThread : public QThread
{
    Q_OBJECT

private:
    QTextEdit* mTextEdit;

public:
    MyThread(QTextEdit* parTextEdit);

protected:
    void run();
};

#endif // MYTHREAD_H
MyThread.cpp

Code: Alles auswählen

#include "MyThread.h"

MyThread::MyThread(QTextEdit* parTextEdit = NULL)
{
    mTextEdit = parTextEdit;
}

void MyThread::run()
{
    while(true)
    {
        QMetaObject::invokeMethod(mTextEdit, "append", Qt::QueuedConnection, Q_ARG(QString, "Foo"));
    }

    exec();
}
Gruß PsyPath
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: C# GUI-Performance VS. Qt GUI-Performance

Beitrag von odt »

Hallo PsyPath

Möglicherweise ist die Qt-Variante auch nur zu schnell. D.h. dass die C#-Variante einfach nur weniger "appends" als die Qt-Variante macht. Für einen aussagekräftigen Vergleich benötigst Du wohl eher eine Aussage wie "1000 appends pro Sekunde", d.h. ein Zähler fehlt.

Dass die Qt-Variante "blockiert" liegt daran, dass der Background-Thread mehr "Events" erzeugt, als der GUI-Thread abarbeiten kann. Zudem musst Du Dich auch um das Aufräumen beim Schliessen kümmern.

Viele Grüsse
Reto
ODT Informatik GmbH, Reto Tschofenig
PsyPath
Beiträge: 2
Registriert: 2. Juni 2014 00:54

Re: C# GUI-Performance VS. Qt GUI-Performance

Beitrag von PsyPath »

Den Schleifenkopf hab ich nun wie folgt abgeändert: for (int i = 0; i < 10000; i++)
In beiden Programmen hab ich eine Zeitmessung für den Vorgang eingebaut. Am Anfang des Threads wird diese gestartet und am Ende des Threads wird geschaut, wie viel Zeit vergangen ist.
Dazu benutze ich in C# die Klasse Stopwatch und in Qt die Klasse QTime.

Laut Ausgaben benötigt das C#-Programm 9279 Millisekunden und das Qt-Programm nur 22 Millisekunden. Da kann doch was nicht mit rechten Dingen zugehen...

EDIT: Ich hab das ganze jetzt nochmal ohne extra Threads laufen lassen und wie man sieht ist Qt schneller. C# 3387 Millisekunden und Qt 1543 Millisekunden. Allerdings bringt mir das rein gar nichts, wenn ich das Fenster dabei nicht bewegen kann.
Leider hilft folgendes im Konstruktor des Fensters auch nicht, um das Fenster beim schreiben bewegen zu können: QThread::currentThread()->setPriority(QThread::HighestPriority);
Gibt es eine andere Möglichkeit? Ich weiß nicht wann oder wie viel geschrieben wird.
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: C# GUI-Performance VS. Qt GUI-Performance

Beitrag von odt »

wie ich's erwartet habe.
wenn mehr "Events" reinkommen, als der GUI-Thread verarbeiten kann, stockt Qt und .Net wird wohl laggen.
wieviele Events erwartest Du denn in Deinem realen Thread? Wenn's via Netzwerk kommt, werden es wohl nicht derarart viele "Events" sein.

-> im Thread nen sleep einbauen
ODT Informatik GmbH, Reto Tschofenig
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: C# GUI-Performance VS. Qt GUI-Performance

Beitrag von veeman »

Ich würde dafür ein QListView verwenden und das ganze mit einem Model kapseln.
Die Daten kann man dann ohne "große Verzögerungen" in das Model schreiben.
Das QListView aktualisiert seine Ansicht erst wenn der Benutzer die Anischt ändert bzw. wenn das Element dazu Zeit hat.
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: C# GUI-Performance VS. Qt GUI-Performance

Beitrag von nebler »

Meine spontane Frage: Was wird den erwartet, wenn der GUI Thread quasi dauerhaft blockiert wird und ihm so die Möglichkeit nimmt auf User-Interaktionen zu reagieren?

Schon gesehen?
http://qt-project.org/doc/qt-4.8/qcorea ... cessEvents
Antworten