Auslösung: DrawText unter Vista gegenüber XP um bis zu Faktor 50 langsamer!

Am 17. Januar habe ich den folgenden Artikel geschrieben: DrawText unter Vista gegenüber XP um bis zu Faktor 50 langsamer!

Ich möchte Euch die Auflösung des Problems nicht vorenthalten.

Eigentlich ist es keine Lösung sondern nur der Fakt, dass auch XP unter gleichen Bedingungen genauso lahm ist wie Vista.
Es liegt an den erweiterten Spracheinstellungen, die unter XP optional sind aber eben nicht mehr unter Vista. Dort sind die immer mit installiert.

So sieht das ganze bei einer normalen XP Installation aus, mit der entsprechenden Performance:
XP-DrawText-Fast

Man kann sehen, dass die zwei unteren Checkboxen aus sind. Wenn man diese nun einschaltet und die entsprechenden Module nachinstalliert werden, dann erlebt man unter XP nach einem Neustart die selben Geschwindigkeitseinbruch wie unter Vista:
XP-DrawText-Slow

Mein Testprogramm läuft fast 50mal langsamer als bei der Standardinstallation und damit genauso schnell/lahm wie unter Vista. Nimmt man die zwei Checks wieder heraus, dann hat man den alten gewohnten Speed.

Wenn man unter Vista in den entsprechenden Dialog der Systemeinstellung sieht, kann man auch sehen, dass man hier nichts mehr beschleunigen kann durch eine eventuelle Deinstallation, denn offensichtlich gehören diese Bestandteile bei Vista zum Inventar:
Vista-DrawText-Slow

So und damit ist auch diese Supportanfrage bei Microsoft „ungelöst“, aber zumindest „erklärt“ geschlossen.

Ich frage mich dennoch warum eine solche EInstellung solche Auswirkungen haben muss. Letzten Endes sind das auch nur Fonts mit denen umgegangen werden muss. Ich finde diesen extremen Unterschied auffällig, allerdings wird sich vermutlich nichts daran ändern…

Ich wünsche allen Lesern einen schönen Juli und verziehe mich jetzt erstmal für die nächsten 2 1/2 Wochen ohne Laptop und PC an die Nordsee, zum Radfahren, Baden und Drachen steigen lassen… 😉

Tipps & Tricks: Warum nicht mal ein anderer Font, wie z.B. Consolas

Eigentlich bin ich sehr konservativ was meine Visual-Studio Einstellungen betrifft. Aber irgendwie hat mich heute mal die Experimentierlaune überkommen, weil ich durch Zufall über einige Color-Schemes gestolpert bin und im C++ Forum eine Diskussion lief ob „hell auf dunkel“ oder „dunkel auf hell“ besser ist.

Am Ende des Experimentierens, habe ich das Farbschema gelassen wie es ist. Ich habe ja auch VA-X, den untentbehrlichen Helfer des Programmieres,  und auch da ist bis auf das Highlighting alles Standard. Aber bei der Schriftart habe ich – für mich gefühlt – was besseres gefunden: „Consolas“.
Eindeutig für mich das schönere Schriftbild, klarer und etwas kompakter und kleiner als „Courier New“.

Beispiel „Courier New“
CourierNew

Beispiel „Consolas“
Consolas
Wer mag, der kann es gleich probieren. Auf meinen Vista Rechnern war diese Schriftart sofort vorhanden. Wer das Font-Paket nicht hat, der kann es herunterladen bei Microsoft Consolas Font Pack for Microsoft Visual Studio 2005 or 2008

Wenn Atheisten und Christen durch Deutschland reisen

Wahrscheinlich haben schon einige von der http://www.buskampagne.de gehört. Es ist der Deutsche Ableger der Atheist Bus Campaign.
Zu Werbeflächen auf Bussen wie in England hat das Geld nicht gereicht, aber zu einer Tour durch Deutschland.
Das Missionswerk Campus für Christus hat sich an die „Versen“ der Tour gehängt und eine eigene Gott-kennen-Tour daraus gemacht.

Hier ein Bericht der ca. 3 Wochen von Thomas Schneider (aus christlicher Sicht). Ein vergnügliches Tagebuch, finde ich, dass auch so manche Begegnung zwischen den beiden Busbesatzungen schildert.

http://www.schneider-breitenbrunn.de/2009-06/wenn-atheisten-und-christen-durch-deutschland-reisen-1-9-tag/
http://www.schneider-breitenbrunn.de/2009-06/wenn-atheisten-und-christen-durch-deutschland-reisen/

PS: Viele der Links auf Zeitungs- und Medienberichte aus Rundfunk und Fernesehen sind lesens- und sehenswert.

Die Funktion ReportFault unter Vista kehrt nicht mehr zurück, entgegen der Dokumentation

Wer unter Windows XP angefangen die FaultRep.dll für Crash-Reports zu verwenden, wird unter Vista eine üble Erfahrung machen. Entgegen der Dokumentation kehrt ReportFault unter Vista nicht zurück.

Das ist besonders lästig, wenn man nach dem Melden des Fehlers aufgrund des Feedbacks des Kunden noch selber Aktivitäten in der eigenen Software vorgesehen hatte.

Wieder ein Fall wo es schwierig ist zwischen verschiedenen Windows-Betriebssystemen kompatibel zu bleiben. Da hat man sich auf Windows XP eingelassen und unter Vista ist das entsprechende Interface schon wieder deprecated.

Die HashKey Implementierung in der MFC in VC-2005 und VC-2008

Die Maps in der MFC werden ja auch zum Teil gerne verwendet. Auch wenn viele Programmierer eher auf die std::map bzw. std::hash_map verwenden.

Zwei interne Dinge sind jedoch vielen Entwicklern nicht klar.

  1. Die Standard-Maps der MFC werden mit 17 Hash-Buckets erzeugt. Man sollte sich also über die Anzahl der Elemente klar werden, die gespeichert werden sollen.
    Bei großen Datenmengen sollte man evtl. darüber nachdenken, die Anzahl der Buckets zu erhöhen.
  2. Ist die Hash Funktion zu beachten, die hier verwendet wird. Denn deren Effektivität entscheidet ja, wie die Einträge auf die Buckets verteilt werden.

Zu diesem zweiten Punkt macht man eine erstaunliche Entdeckung, wenn man sich ansieht, was Microsoft für eine Funktion vorgesehen hat um den Hask-Key zu erzeugen. Diese Funktion ist in der MFC für primitive Werte vordefiniert, als primitive Werte sehe ich alle numerischen Werte, Zeiger und Handle an.
Man findet eine Implementierung als Template-Funktion in afxtempl.h:

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
 // default identity hash - works for most primitive values
 return (DWORD)(((DWORD_PTR)key)>>4);
}

Das erstaunliche ist für mich, dass hier die untersten 4 Bits einfach abgeschnitten werden. Für mich hätte für Handles, Zeiger und Integer Werte einfach ein cast gelangt.

Nehmen wir jetzt mal an, wir haben eine einfache Datenmenge, die die Integer 1-100 auf eine Struktur abbilden. Man wird die erstaunliche Entdeckung machen, dass alle Werte nur in den Buckets 0-6 abgespeichert werden. Die Buckets 7 bis 16 werden nicht verwendet.

Der Nachteil ist offensichtlich. Man nutzt das Datenrauschen auf den untersten 4 Bits nicht.
Das macht sich sogar bei Fensterhandles bemerkbar. Bekanntlich sind das immer gerade Werte, aber auch auf den Bits 1-3 finden wir hier Informationen. Auch hier werden nützliche „zufällige“ Informationen nicht genutzt. Dadurch werden mehr Kollisionen in Kauf genommen als notwendig wären.

Ich möchte nicht unerwähnt lassen, dass die MFC Maps wirklich eine Berechtigung haben, weil sie grundsätzlich einen Pool-Allocator verwenden. Häufige Allokationen und Löschungen werden weitaus schneller behandelt, als durch die std::map, oder std::hash_map mit normalen Allocator.

Ich habe diesen Bug (oder miese Verhalten) bereits in der Beta für VC-2008 gemeldet. Es wurde aber nicht mehr geändert. Nun habe ich es an die Produktgruppe erneut  für VC-10 eingereicht.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100772
Nachtrag 22.06.2009: Da der Bug von Microsoft nicht neu geöffnet wird habe ich einen neuen für VS-2010 Beta 1 angelegt.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=468860
Wer Lust hat, der kann ja abstimmen.

BTW: Die HaskKey Funktion in afxtempl.h ist für andere Maps (z.B. CMapPtrToPtr) direkt in der Klasse definiert. Dieses Template wird nur vom CMap-Template verwendet.

Vista SP2 Backup Dateien freigeben

Wer, wie auch beim Vista SP1, einige 100 MB Speicher nach der Vista SP2 Installation zurückhaben möchte, der kann einfach die angelegten Backup Dateien entfernen. Natürlich nur wenn man SP2 auch wirklich nicht mehr entfernen will.

Dazu einfach das kleine Programm compcln aufrufen.Dazu muss man ein CMD-Fenster im Admin Modus öffnen und einfach folgenden Befehl ausführen:

%windir%\system32\compcln.exe

Die komplette Dokumentation findet sich hier:
http://technet.microsoft.com/de-de/library/dd335037(WS.10).aspx

PS: Nett ist, dass dieses Tool auch die SP1 Dateien entfernt. Was ich noch nicht ganz verstanden habe ist ob auch andere Hotfix Backups entfernt werden. Bei mir auf meinem Laptop wurden durch dieses Tool ca. 500 MB freigegeben. Vista SP1 hatte ich bereits entfernt.

Tipps & Tricks: Wie man einen permanenten ASSERT direkt mit einem Kommentar versieht

Ich verwende gerne ASSERT’s in meinem Code.
Sie sind ein wirksames Mittel Zustände abzufragen und bereist in der Testphase unzulässige Konstellationen oder Funktionsaufrufe zu entdecken.

Nun gibt es ja auch if, else oder switch Blöcke an denen das Programm normalerweise nicht vorbei kommen sollte. So eine Stelle versieht man dann schon mal mit einem

_ASSERT( FALSE );
// oder wer die MFC benutzt eben ASSERT,
// obwohl dies auch nur ein Synonym für den CRT _ASSERT makro ist
ASSERT(FALSE);

Jetzt müsste man noch einen Kommentar davor setzen, damit klar wird was hier schief läuft. Man kann das Ganze aber auch einfach kombinieren und noch einen Zusatznutzen erreichen indem man den etwas unbekannteren Makro _ASSERTE verwendet:

_ASSERTE( !"MyFuncFooHandler: This is not allowed in my special Foo Handler" );

Die Negation macht aus dem Zeiger auf den konstanten String FALSE, und damit schlägt der ASSERT an.
Wenn man jetzt wie hier gezeigt noch den _ASSERTE Makro verwendet, dann wird diese Expression, also der Text, sofort mit anzeigt. Man sieht dann sofort was das Problem ist sobald der ASSERT Dialog angezeigt wird.

Vista: Nach Installation von SP2 wird immer wieder nach einem WPD-Gerätetreiber gesucht

Ich habe ja schon einmal von einem Problem mit dem WPD-Treiber berichtet:
Vista: Ausrufezeichen vor Microsoft WPD-Dateisystem-Volumen-Treiber im Gerätemanager

Jetzt habe ich Vista SP2 installiert und nach jedem Neustart meines Systems sucht Vista nun immer wieder nach einem WPD-Gerätetreiber. Wenn man Vista anweist nie wieder nach solch einem Treiber zu suchen, ignoriert es das gefliessentlich. Genauso wie die erneute Suche nach dem Treiber, der auch gefunden wird, interessiert meine Rechner gar nicht.

Abhilfe hat bei mir nur folgendes geschaffen.

  • Öffnen der Computerverwaltung, dort Datenträgerverwaltung aufrufen
  • Allen Laufwerken, die dort aufgeführt werden weisen wir nun einen beliebigen Laufwerksbuchstaben zu (das sind zu 100% die Laufwerke von den Speicherkartenleser, die einmal entfernt wurden)
  • Dann starten wir den Rechner neu
  • Entfernen alle diese Laufwerksbuchstaben wieder über die Datenträgerverwaltung in der Computerverwaltung
  • Und der Spuk ist vorbei.

Beim nächsten Neustart wird nicht wieder nach einem Treiber verlangt.

Arcandor will 650 Millionen vom Staat…

… damit 50.000 Arbeitsplätze gerettet werden. Und die Gewerkschaften schicken Ihre Leute auf die Straße, damit sie für eine Intervention des Staates werben.

Und das ganze weil das Management seine Hausaufgaben nicht gemacht hat.
Und unser Münte erklärt, dass für die Dämlichkeit der Geschäftsführer nun der normale Arbeiter nicht büßen dürfe…

Unfassbar. Da soll jeder Arbeitsplatz mit 13.000 Euro gestützt werden.

Ein guter Freund von mir, hatte ein kleines Photoatelier und war als freier Photograph tätig. „Hatte & war“ deshalb, weil die Bank meinem Freund aufgrund mieser wirtschaftlicher Lage den Hahn abgedreht hat.
Die Banken fackeln aktuell nicht lange, wenn eine kleine Firma in Geldnot gerät. Jetzt ist er auf Harz IV und hat einen Rechtsanwalt für die Schuldenberatung und versucht etwas tragbares mit seinen Gläubigern auszuhandeln.

Eigentümlicher Weise wurde ihm vom lieben Franz Müntefering oder einem unserer lokalen Politiker keine 13.000 Euro angeboten um seinen Arbeitsplatz zu retten… ist irgendwie unverständlich…

Aber ich bin ehrlich: Ich bin nicht dafür, dass der Staat in solche wirtschaftliche Normalitäten eingreift. Konkurse und Firmenpleiten gehören zu den bereinigenden Vorgängen unserer Marktwirtschaft. So hart es nun mal ist, aber es gehört zu unserem System und man bestraft durch solch eine staatliche Unterstützung nur die, die korrekt gewirtschaftet haben.

Selbst wenn ich es meinem Freund gegönnt hätte, richtig wäre eine staatliche Unterstützung nicht gewesen und sie ist auch nicht korrekt für Arcandor/Karstadt.

VC-2010: Breaking Changes in der STL

Ich habe mein erstes größeres Projekt mal testweise in VS-2010 übernommen und bin sofort über ein Problem in der STL gestolpert. Ein std::set<FOO>::iterator liefert in VC-2010 jetzt eine const FOO & Referenz!

Das Ändern von Objekten in einem std::set war sowieso nur erlaubt, wenn sich die Reihenfolge nicht ändert.

Die Folge ist, dass der nachfolgende Code in VC-2010 nicht mehr kompiliert.

#include <set>
struct S_FOO
{
    unsigned long     m_dw1, m_dw2;
    // simplified sample without bool operator<
};

class CMySet : public std::set<S_FOO>
{
public:
    void SomethingSpecial()
    {
        // Order must not be changed!
        for (iterator it=begin(); it!=end(); ++it)
            it->m_dw1 = 0;   // <----- C3892!
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    CMySet myset;
    myset.SomethingSpecial();
    return 0;
}

Man erhält den Fehler C3892: ‚it‘ : you cannot assign to a variable that is const

Das und noch einige andere Breaking Changes  wurden gestern in VC-Blog veröffentlicht:

http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx