2015-08-28 21 views
5

Ich habe vor kurzem das .NET-Framework auf meiner Maschine auf .NET 4.6 aktualisiert und habe einen großen Unterschied in Zeiten der binären Serialisierung von Objekten aus/zu Dateien festgestellt.Binäre Serialisierung langsam (manchmal) in .NET 4.6

Zum Beispiel habe ich eine 10MB-Datei, die in ~ 2 Sekunden auf meinem Rechner mit .NET 4.5.2 deserialisiert wurde. Nach dem Upgrade auf .NET 4.6 dauert es bis zu 50 Sekunden (!) - die tatsächliche Zeit ist ziemlich zufällig: manchmal dauert es 2 Sekunden, manchmal 50 Sekunden (dieselbe Datei, dasselbe Programm, sogar derselbe Prozess).

Hat jemand anderes ähnliches Verhalten bemerkt und vielleicht eine Abhilfe (oder Lösung) für dieses Problem gefunden?

+7

Können Sie Ihre Aussage mit Code beweisen? Die Frage "Manchmal funktioniert etwas nicht" wird wahrscheinlich geschlossen. Welche Anstrengung haben Sie in die Forschung investiert, bevor Sie gefragt haben? – netaholic

+0

Nun, mein Programm ist ziemlich komplex (ich serialisieren Objekte mit Hunderten von Feldern), aber ich werde versuchen, ein kleineres Beispiel für das Problem zu finden. Ich habe versucht, irgendwelche Informationen über Änderungen (oder Probleme) zu .NET 4.6 zu finden, aber bis jetzt habe ich keine gefunden (obwohl es Beweise für einige schwerwiegende Probleme in .NET 4.6 RyuJIT gibt, also möglicherweise Serialisierungsprobleme ist auch irgendwie verwandt) – Bartek

+0

Werden Klassen oder Strukturen (de) serialisiert? –

Antwort

4

Kein Grund anzunehmen, dass es etwas mit binärer Serialisierung zu tun hat, es ist ziemlich deterministisch. Angesichts des zufälligen Verhaltens und der Wahrscheinlichkeit, dass Sie den Garbage-Collector mit einer 10-Megabyte-Datei ziemlich schwer stoßen, ist ein sehr guter Kandidat this bug. Ziemlich doof.

Wenn Sie eine gute Repro haben, dann verwenden Sie die neuen Diagnosewerkzeuge, um langsame Gen # 1 Sammlungen zu sehen. Und basteln Sie mit GCSettings.LatencyMode, wenn es einen Affekt hat, dann wissen Sie, dass es die zugrunde liegende Ursache ist. Sollte bald behoben werden.

+0

Vielen Dank für diesen Hinweis . Ich habe einen Thread hinzugefügt, der den Prozentsatz der Zeit in GC überwacht. Es stellte sich heraus, dass an diesen kritischen Stellen (während/nach der Deserialisierung) 99% der Zeit in GC verbracht wurden (mit Standardeinstellungen). Als ich zu GCLatencyMode.LowLatency wechselte, blockierte es nicht mehr und% der GC-Zeit war wie 50% oder so. – Bartek

+1

Erreiche eins für psychisches Debugging. –

+0

Liebe, solche Antworten zu lesen. Das identifiziert die Frage als Symptom und antwortet mit einer Lösung für das eigentliche Problem. – jgauffin

0

Wir haben beim Deserialisieren von Objekten genau das gleiche Problem mit der BinaryFormatter angetroffen. Wie wir gesehen haben, ist dies auf einen Fehler in Framework 4.6 zurückzuführen, der in Framework 4.6.1 gelöst wurde. Die Liste der Änderungen wird gefunden here. Der Fehler ist Verbesserte Leistung der parallelen Binärdatei Deserialisierung [141896].

+0

Für unsere App 4.6.1 löste nicht die langsame Leistung musste zurückrollen zu .net 4.5.2 –

+0

@Oldfart Wie Sie uns 4.5.2 verwendet - normal, 4.6 extrem langsam, 4.6.1 wieder normal. – participant

Verwandte Themen