Geschwindigkeit QLabel setText()

Alles rund um die Programmierung mit Qt
Antworten
iphenion
Beiträge: 17
Registriert: 4. Januar 2008 15:40
Wohnort: Wetter
Kontaktdaten:

Geschwindigkeit QLabel setText()

Beitrag von iphenion »

Hallo,
ich habe hier ein eklatantes Performance Problem beim setzen
der Text Eigenschaft eines QLabel.
Als Beispiel mal dieser Code:

Code: Alles auswählen

void Mainwin::on_test2Action_triggered() {
	qDebug ("test2Action triggered");
	sdiftime_usec();
	for (int t=0; t<1000;t++) {
		QString str;
		str = "Test:";
		str += QString::number(t);
		labelDumpfile->setText(str);
		QCoreApplication::processEvents();
	}
	unsigned long long er = sdiftime_usec();
	modul_textEdit->append(QString("Zeit:%1ms").arg(er/1000));
	qDebug ("Zeit:%llums",er/1000);
}
Die Ausführungszeit hierfür ist auf einem IntelCore2 Quad
über 8 Sekunden! Also ca. 8 ms pro Durchlauf.
QT Version ist 4.3.1.
Woran liegt es, dass das so grottenlangsam ist?
Das Label liegt in einem Gridlayout in einem QFrame, der wiederum in einem Tab Widget liegt.
Wenn ich das Label auf die "erste Ebene" bringe, komme ich immerhin auf eine Zeit von 1ms pro Durchlauf.

Hat jemand eine Erklärung dafür bzw. einen Tipp, wie ich das
beschleunigen könnte?

Gruß, Peter
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dieser Testcase ist irgendwie... sinnlos :)

Bei jedem neuen Setzen muss auch das Layout usw. neu berechnet werden. Das dauert schon ein wenig. Und wie lange er in QCoreApplication::processEvents() rumhängt um irgendwelche Events abzuarbeiten sieht man auch nicht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
iphenion
Beiträge: 17
Registriert: 4. Januar 2008 15:40
Wohnort: Wetter
Kontaktdaten:

Beitrag von iphenion »

Hallo,
sensationell, wie schnell diese Antwort kam.

Das der Aufruf von processEvents hier sinnlos ist, ist schon klar.
Ich möchte halt (zu Testzwecken) erreichen, das das Layout
explizit berechnet und der Text ausgegeben wird.

In meiner Anwendung erfolgt die Ausgabe Timer gesteuert.(ca. 10 mal pro Sekunde)
Leider wird durch die Ausgabe die Mainloop so lange unterbrochen, das die restliche Bedienung leidet.
Das kann ja wohl nicht sein. So krass habe ich das noch nie gesehen. Bei GTK funktioniert das z.B. schneller und auch
mit der Beta von QT 4.4 ist der Effekt nicht ganz so drastisch (ca. 3ms im Gegensatz zu 8ms mit QT 4.3)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Also 10 mal pro Sekunde irgend eine Änderung ist zwar für das menschliche Auge ggf. zu viel aber für Qt sollte das ok sein. Ein realistischeres Testcase könnte ggf. mehr Aufklärung bringen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten