Nel mio serialiser/deserialiser, ho il seguente frammento di codice:Il modo più veloce per verificare se un tipo è blittabile?
if (element_type.IsValueType && collection_type.IsArray)
{
try
{
GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
var array_data = new byte[arrayDataSize];
Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
h.Free();
WriteByteArray(array_data);
return;
}
catch (ArgumentException)
{
//if the value type is not blittable, then we need to serialise each array item one at a time
}
}
il cui scopo è quello di provare a scrivere una serie di tipi di valore a un ruscello, nel modo più efficiente possibile (cioè, solo il contenuto come un mucchio di byte).
Il problema si presenta quando il tipo è un tipo di valore ma non blittabile e Alloc() non riesce. Al momento viene rilevata l'eccezione e il controllo passa al codice che gestisce l'array come se fosse costituito da tipi di riferimento.
Questo controllo tuttavia (a causa del lancio e della cattura dell'eccezione che a mio avviso è molto lento) si sta rivelando un grave collo di bottiglia a causa del numero di tipi di valore riscontrati nella mia applicazione. Quindi mi chiedo, qual è il modo più veloce per verificare se un tipo è blittabile?
Ho avuto lo stesso problema, ho finito con il caching dei risultati per ogni tipo (ad esempio nel dizionario statico). Il controllo è stato fatto come qui, prova/cattura. –