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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top