Seite 1 von 1

C# GUI-Performance VS. Qt GUI-Performance

Verfasst: 31. Juli 2014 15:13
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

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

Verfasst: 31. Juli 2014 16:15
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

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

Verfasst: 6. August 2014 17:45
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.

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

Verfasst: 7. August 2014 09:34
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

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

Verfasst: 7. August 2014 11:08
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.

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

Verfasst: 29. August 2014 18:14
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