Seit ein paar Tagen erlebe ich etwas sehr Merkwürdiges. Ich habe herausgefunden, dass mein Release-Build tatsächlich ausgeführt wird Langsamer als die Debug-Version.
1. Das Problem
Ich habe schließlich alles von meinem Einstiegspunkt (Main) in meiner Windows Forms-Exe entfernt, so dass nur dies übrig bleibt:
[STAThread]
static void Main(params string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
System.Xml.Serialization.XmlSerializer xmlS =
new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());
}
Ich instanziere also eigentlich keine Forms mehr, sondern teste nur noch. TestClass
ist eine kleine Klasse mit nur drei öffentlichen int
Eigenschaften und sonst nichts. Meine Haupt-.exe (Windows Forms) ist ~1Mb groß, wenn das einen Unterschied macht.
2. Ergebnisse
Im Debug-Modus beträgt die verstrichene Zeit ~200 ms, während sie im Release-Modus ~1,2 s beträgt.
3. Zusätzliche Informationen
Das Seltsame ist, wenn ich versuche, ein anderes Projekt in dieser Lösung als Startprojekt festzulegen, denn in diesem Fall funktioniert es schnell (genau der gleiche Code wie oben).
4. Schnelles Hacken
Um diesen Fehler so schnell wie möglich zu beheben, habe ich ein neues .exe Startup-Projekt in meiner Lösung erstellt, das das Hauptanwendungsformular instanziiert und ausführt, indem es auf mein erstes Einstiegsprojekt verweist. In diesem Fall funktioniert es wieder schnell, meine Einstiegs-Exe ist jetzt nur noch 24kb groß und enthält nur eine statische Main-Methode.
Ist jemandem ein ähnliches Verhalten schon einmal aufgefallen? Wenn ich irgendwo anders darüber gestolpert wäre, würde ich beim Betrachten des obigen Codes wahrscheinlich vermuten, dass es irgendwo einen statischen Initialisierer gibt, der tonnenweise Arbeit in einem separaten Thread verrichtet (aber das ist hier nicht der Fall, ich habe das Zeug nicht), und außerdem läuft er nur im Release-Build?
[Bearbeiten] Mehr Informationen: Ich bin mir bewusst, dass XmlSerializer IL-Code zur Laufzeit generiert, aber meine eigentliche Frage ist, warum es in diesem Fall langsamer arbeitet als in anderen Fällen. Wenn ich nur die eigentliche Serialisierung benchmark, ist es 3x langsamer in Release (aber nur, wenn ich es von meinem ursprünglichen Projekt ausführen).
[Update] Und jetzt kommt das Verrückteste überhaupt: Nach einigen Modifizierungs-/Erstellungsschritten begann mein neues Einstiegsprojekt, sich wie das erste zu verhalten - langsamer Start, langsames Laden. Ich änderte den Projektnamen und die GUID und erstellte es neu, und es funktioniert wieder schnell.