Ho avuto una certa esperienza nell'ottimizzare il codice di rete, sia nativo che .NET. Le cose che amo sono importanti:
- Quanti messaggi / secondo vengono trasferiti?
- Quanti megabyte / secondo vengono trasferiti?
- Questa è una lingua raccolta dalla spazzatura? (Nel tuo caso, no)
- Quali sono i requisiti della tua app?
Se 1 è "piccolo" (50 al secondo o meno?), allora il tuo codice di rete francamente non è ciò che qualcuno noterà. Dovresti invece ottimizzare per la compatibilità con il tocco o migliorare i flussi di lavoro dei tuoi clienti; avrai più soldi per il dollaro. Per la scala server, dovrai preoccuparti di più dell'affinità dei thread piuttosto che delle copie di memoria. Se è grande, un certo numero di SO ora include speciali API di rete per gestire il numero di shear delle chiamate - Windows, per esempio, ha le API RIO in Winsock proprio per questo.
Se 2 è "grande" (> 100 megabyte / secondo), è necessario preoccuparsi di eseguire copie aggiuntive sui server, ma solo a causa della pressione della memoria. In particolare per un ambiente VM, la pressione della memoria sarà spesso ciò che impedisce alla VM di gestire più client, il che porta immediatamente a dover eseguire più VM.
Se 3 è vero e # 1 è "grande" e sei su un server, devi preoccuparti del blocco della memoria e della durata dell'oggetto. Ma non lasciarti guidare da te per evitare i linguaggi GC; ci sono molti grandi programmi che fanno networking in lingue GC.
E # 4 è veramente importante. Hai requisiti di latenza estremi come gli operatori di borsa ad alta velocità? Hai misurato la tua performance?
Raramente incontro programmi client-side in cui l'ottimizzazione del numero di buffer copiati ha fatto la differenza che gli utenti potevano vedere. Per i server, in genere prima vedo che c'è un collo di bottiglia inaspettato che colpisce molto prima di ogni altra cosa. Ci sono un sacco di tecniche per aiutare - scalabilità lato ricezione, varie tecniche asincrone e chiamate speciali di gestione del buffer.
TL; DR: se non sei un server, mantieni il tuo codice pulito. Se lo sei, misura prima, ottimizza secondo. E "ottimizzare" include molte tecniche, di cui "copia meno memoria" è una.