❗ Ja Ihr habt ganz richtig gelesen und ich irre mich nicht ❗
Wir haben in einem unserer C++/MFC Programmen eine komplexe Anzeige von Reports, die alle unterschiedliche Zeilenhöhe haben und in einem speziellen Fenster angezeigt werden (eigene Entwicklung).
Nun stellten wir fest, dass das Rollen in diesem Programmteil auf Vista-Rechnern mit viel Nachlauf funktionierte und auch einige andere Operationen länger als gewohnt dauerten. Bei meinem Suchen, Profilen und Testen kam ich auf ein sehr lahmes Abarbeiten der Funktion DrawText mit DT_CALCRECT.
Um das Problem zu isolieren schrieb ich ein kleines Testprogramm, das erstaunliches zu Tage brachte.
Hier die Ergebnisse von 4 verschiedenen Rechnern (Durchlauf von 100×100 DrawText Calls):
- Pentium Quad-Core Q8200 mit Vista: 48.111 msec
- Pentium Core2Duo T2310 mit Vista: 78.953 msec
- Pentium Dual Core 3,2Ghz mit XP: 1.516 msec
- Alter Pentium 3,0Ghz HT mit XP: 1.922 msec
😯 Der Code ist teilweise um den Faktor 50 langsamer auf Windows-Vista im Vergleich zu Windows-XP ❗
Wer Lust hat es selbst zu testen, der findet hier das Beispielprogramm im Sourcecode (VS-2005): TestDrawText.zip
Wer das Programm als Exe möchte findet es hier: TestDrawTextExe.zip
Beschreibung:
Dieses Beispielprogramm führt gemäß einem angegebenen Zähler je 100mal DrawText mit DT_CALCRECT für einen längeren mehrzeiligen Text aus. Hierbei werden immer zufällige Textlängen verwendet. Der Algorithmus liefert jedoch immer die gleiche Zufallssequenz, damit der Test auch Vergleichbar bleibt.
Der Zufallsmechanismus wurde nur eingebaut, um für für meinen Fall realitätsnahe Daten zu liefern.
Anmerkung:
Eine entsprechende Supportanfrage bei Microsoft läuft ❗
Was dabei herauskommt werde ich berichten…
Zuletzt angemerkt:
Windows 7 soll ja schneller sein als Windows Vista. Wer weiß? Ich habe es noch nicht getestet.
Vieleicht haben die nur diesen Bug gefixed und einen gigantischen Performanceschub erhalten … SCNR…
Nachtrag (11.07.2009):
Die Auiflösung zu diesem Problem findet sich hier in diesem Artikel http://blog.m-ri.de/index.php/2009/07/11/ausloesung-drawtext-unter-vista-gegenueber-xp-um-bis-zu-faktor-50-langsamer/
Auf der Seven Beta ist es genauso lahm wie auf Vista.
Core 2 Duo E6750 mit XP: 1.016 msec
Hab‘ leider kein natives Vista/7, nur auf einer VM. Gibt es Unterschiede in der Geschwindigkeit von DrawText() zwischen Aero Basic und Aero Glass? hinter beiden Varianten steht jeweils ein anderes Treibermodell, Basic = WDM, Glass = WDDM.
Das spielt keine Rolle. Selbst wenn man ganz auf Aero verzichtet und den klassischen Windows-Stil einstellt, dann bleibt DrawText eine lahme Ente.
Es muss in den Kernstrukturen von Vista liegen.
Q6600 mit Windows 7 (x64): 45053 ms
Ohne DT_WORDBREAK geht es um einiges schneller. Vielleicht hat Vista ja einen verbesserten Algorithmus für den Wortumbruch, der nicht mehr ganz so performant ist wie früher.
Hast Du die Compatibiltätssettings schon durchgescrollt? Ich habe bei einigen älternen Programmen so meine Probleme, solange der Desktopmanager Vista im Aero-Look hält. Irgendwas mit 3D-Desktop und 2D Drawing. Ist allerdings nix gemessenes, sondern eher so eine Gefühlssache…
Auf einem DELL Precision M50 dauerte es mit Windows 7 und allen Updates
110268 ms.
Also noch langsamer als mit Vista auf dem gleichen Rechner.
Es ist auch egal ob mit VS 2005 oder 2008 erstellt.
Gibts eigentlich schon Neuigkeiten von Microsoft wg des Problems? So ein „Wir können es nachvollziehen und kümmern uns drum“ wäre ja schon angebracht 😉
Letzte Nachricht 05.02.
Zitat: „I have successfully reproduced the problem and compared the application’s performance with XP.“
Ich habe aktuell nur Bestätigungen bekommen und der Support Engineer hat bereits 3 mal in Folge gewechselt, was im Allgemeinen ein gutes Zeichen für das Eskalieren ist… 😉