Esiste in generale una differenza di velocità o di prestazioni nei socket TCP Winsock non bloccanti e non bloccanti? Potrei ottenere le differenze di entrambe le prese ma non esiste un confronto dettagliato delle prestazioni tra i due tipi.Velocità/prestazioni Caratteristiche del winsock di blocco o non bloccante
risposta
Perché non si tratta di velocità. Le operazioni write
e read
sono solo durante la copiatura della memoria in incognito. Tutto ciò che fanno è copiare i dati da e verso il kernel, rispettivamente. Cioè in realtà non inviano o ricevono nulla.
La funzione di blocco e non blocco chiede: preferisci queste operazioni bloccare fino al completamento o per restituire -1 e EAGAIN
nel caso in cui non possano essere eseguite immediatamente? Ad esempio, si legge da un socket ma non c'è nulla nel buffer di ricezione. Preferisci che lo recv
resti sospeso fino a quando qualcosa non arriva o per restituire -1 EAGAIN
?
Grazie per l'illuminazione. –
È piuttosto un travestimento con IOCP, in cui gli array di puntatori del buffer utente vengono comunicati nel kernel con le chiamate WSASend/WSARecv. C'è ancora del movimento dei dati, ma suppongo che i buffer hardware della NIC possano essere trasferiti direttamente nei buffer dello spazio utente, eliminando un livello di copia miserabile. –
Nella mia esperienza le operazioni di winsock non bloccanti sono leggermente più lente ma molto più scalabili. Il fatto è che è necessario effettuare due chiamate di sistema e un po 'di dispacciamento a livello di applicazione quando si esegue l'I/O non bloccante (con IOCP) e una chiamata di sistema se si utilizza l'I/O di blocco. Se si dispone di molte connessioni simultanee, l'I/O non bloccante è molto più veloce a causa di un'architettura più scalabile se implementata correttamente.
Se è necessario trasferire i dati da punto a punto con larghezza di banda massima, utilizzare l'I/O di blocco. Se è necessario gestire molte connessioni client simultanee, utilizzare I/O non bloccante. Non aspettarti troppo da nessuno di loro.
In generale si tratta più dell'architettura del server "event-driven vs threaded", quindi "blocking vs nonblocking". Non esiste un'architettura server universale che possa essere utilizzata in qualsiasi situazione. Dipende dall'applicazione.
Se qualcosa, taggerei questa domanda come C non C++. –