2015-08-28 23 views
5

Ho recentemente aggiornato il framework .NET sulla mia macchina su .NET 4.6 e ho notato una grande differenza nei tempi di serializzazione binaria (de) di oggetti da/a file.Serializzazione binaria lenta (a volte) in .NET 4.6

Ad esempio, ho un file da 10 MB che è stato deserializzato in ~ 2 secondi sulla mia macchina con .NET 4.5.2. Dopo l'aggiornamento a .NET 4.6 ci vogliono fino a 50 secondi (!) - il tempo reale è piuttosto casuale: a volte ci vogliono 2 secondi, a volte 50 secondi (stesso file, stesso programma, stesso processo).

Qualcun altro ha notato un comportamento simile e forse ha trovato una soluzione (o una soluzione) per questo problema?

+7

Puoi dimostrare la tua dichiarazione con il codice? La domanda "A volte qualcosa non funziona" verrà probabilmente chiusa. Quale sforzo hai messo in ricerca prima di chiedere? – netaholic

+0

Bene, il mio programma è piuttosto complesso (serializzo gli oggetti con centinaia di campi) ma cercherò di trovare un esempio più piccolo del problema. Ho cercato di trovare qualsiasi informazione su cambiamenti (o problemi) relativi a .NET 4.6 ma finora non ne ho trovato nessuno (anche se ci sono prove di alcuni gravi problemi esistenti in RyuJIT di .NET 4.6, quindi forse problemi di serializzazione è in qualche modo collegato pure) – Bartek

+0

Sei (de) serializzando classi o strutture? –

risposta

4

Piccolo motivo per supporre che abbia qualcosa a che fare con la serializzazione binaria, è piuttosto deterministico. Dato il comportamento casuale e la probabilità che tu possa colpire il garbage collector con un file da 10 megabyte, un ottimo candidato è this bug. Piuttosto un doozy.

Se si dispone di una buona riproduzione, utilizzare i nuovi strumenti di diagnostica per visualizzare le raccolte lente di gen # 1. E armeggiare con GCSettings.LatencyMode, se ha un effetto allora sai che è la causa sottostante. Dovrebbe essere risolto presto

+0

Grazie per questo suggerimento . Ho aggiunto una discussione che monitora la percentuale di tempo trascorso in GC. Si è scoperto in questi punti critici (durante/dopo la deserializzazione) il 99% del tempo è trascorso in GC (con le impostazioni predefinite). Quando sono passato a GCLatencyMode.LowLatency, non si bloccava più e% del tempo di GC era pari al 50% circa. – Bartek

+1

Punteggio uno per il debug psichico. –

+0

piace leggere risposte come questa. Ciò identifica la domanda come un sintomo e risponde con una soluzione al problema reale. – jgauffin

0

Abbiamo riscontrato esattamente lo stesso problema con lo BinaryFormatter durante la deserializzazione degli oggetti. Come abbiamo osservato, ciò è dovuto a un bug nel framework 4.6 che è stato risolto nel framework 4.6.1. L'elenco delle modifiche si trova here. Il bug incriminato è Prestazioni migliorate della deserializzazione del file binario parallelo [141896].

+0

Per la nostra app 4.6.1 non è stato risolto il rallentamento delle prestazioni dovevano tornare a .net 4.5.2 –

+0

@Oldfart Come abbiamo usato 4.5.2 - normale, 4.6 estremamente lento, nuovamente normale 4.6.1. – participant

Problemi correlati