. C # / NET: UnmanagedMemoryStream per il networking?
-
09-10-2019 - |
Domanda
Stavo considerando utilizzando UnmanagedMemoryStream piuttosto che MemoryStream per trattare con i pacchetti in entrata (e forse in uscita?) in un server di rete. Quello che spero di raggiungere è di meno la copia di valori, e, se possibile, evitare di copiare al mucchio (troppo).
Ad esempio, per un pacchetto in arrivo, si potrebbe fare:
fixed (byte* p = &data) // where data comes from a socket receive
{
using (var stream = new UnmanagedMemoryStream(p, data.Length))
{
// do handling here...
}
}
Ancora, non sono del tutto sicuro se non v'è alcun beneficio realistico nel fare questo. Qualcuno potrebbe venire con un feedback da se o non ci sarebbe alcun valore nel fare questo, invece di usare il buon vecchio gestito MemoryStream?
Grazie in anticipo.
Soluzione
No, non ha migliorato ciò che già esiste. Un byte [] è un tipo di riferimento. Si può semplicemente passarlo al costruttore MemoryStream (byte []) e non di dati è sempre copiato. MS memorizza semplicemente un riferimento allo stesso array.
In realtà, è fatto peggio perché è appuntato la matrice. Ottenere un garbage collection per eseguire all'interno del corpo del frammento non è improbabile, che si sta leggendo roba dalla matrice e probabilmente creando oggetti dai dati, stringhe e ciò che-non. Le esigenze garbage collector per aggirare la matrice bloccato, rendendo la vita molto più difficile. Questo può effettivamente influenzare il perf del vostro programma per un po ', compattare il mucchio è importante per rendere la cache della CPU efficiente.
Altri suggerimenti
Questo suona come l'ottimizzazione prematura per me. Hai usato MemoryStream e fatto un po 'di profilazione per mostrare che ha causato voi tangibile, problemi di prestazioni misurabili?
Vorrei rimanere con il MemoryStream convenzionale e salvare me stesso il mal di testa fino a quando è diventato evidente (mediante profilatura) che era necessario per il cambiamento.