阻塞和非阻塞Winsock TCP套接字在速度或性能方面是否存在差异? 我可以得到两个套接字的差异,但是这两种类型之间没有详细的性能比较。阻塞vs非阻塞winsock的速度/性能特征
回答
因为它不是速度。操作write
和read
只是内存复制变相。他们所做的只是分别向内核和内核拷贝数据。即他们实际上不发送或接收任何东西。
阻塞与非阻塞功能问:您是否喜欢这些操作阻塞直到完成或者返回-1和EAGAIN
以防万一无法立即执行?例如,您从套接字中读取,但接收缓冲区中没有任何内容。你喜欢有recv
悬挂,直到有东西出现或返回-1 EAGAIN
?
感谢您的启发。 –
这是IOCP的伪装,用户缓冲区指针数组通过WSASend/WSARecv调用进入内核。仍然有一些数据移动,但我猜测NIC硬件缓冲区可以直接DMA到用户空间缓冲区 - 切断一个级别的悲惨复制。 –
根据我的经验,非阻塞winsock操作稍微慢一些,但更具可扩展性。事实是,如果您使用阻塞I/O,则在执行非阻塞I/O(使用IOCP时)和一次系统调用时,您需要进行两次系统调用以及应用程序级别的一些调度。如果你有很多并发连接,非阻塞I/O要快得多,因为如果实现得好,可扩展的体系结构将更加灵活。
如果您需要以最大带宽从点到点传输数据 - 请使用阻止I/O。如果您需要处理许多并发的客户端连接 - 请使用非阻塞I/O。不要期望太多。
一般来说,这更多的是“事件驱动vs线程”服务器架构,然后是“阻塞vs非阻塞”。没有可用于任何情况的通用服务器体系结构。这取决于应用程序。
- 1. mpi:阻塞与非阻塞
- 2. Winsock的非阻塞IO重叠仍块
- 3. 带延迟的阻塞/非阻塞
- 4. 阻塞套接字性能与非阻塞套接字
- 5. 非阻塞UDP I/O vs阻塞Java中的UDP I/O
- 6. 嵌套Socket阻塞非阻塞SocketHi
- 7. 非阻塞PASV袜子和阻塞
- 8. 是renderer.render()阻塞还是非阻塞?
- 9. 非阻塞写入和阻塞recv
- 10. C++ Winsock recv不会阻塞
- 11. 非阻塞django?
- 12. 非阻塞setTimeout
- 13. 非阻塞spmd
- 14. 非阻塞pthread_join
- 15. PyGTK非阻塞
- 16. Javascript非阻塞
- 17. 非阻塞stdio
- 18. Node.js非阻塞性质
- 19. 非阻塞的PipedStreams?
- 20. 非阻塞的getch()
- 21. 阻止阻塞的线程阻塞
- 22. 阻塞或不阻塞(Express.js)
- 23. Java中的非阻塞CAS是否真的非阻塞?
- 24. 非阻塞连接
- 25. WPF:非阻塞UI
- 26. C#非阻塞Socket.Connect()
- 27. 非阻塞队列
- 28. jQuery each()非阻塞?
- 29. 非阻塞等待
- 30. 非阻塞MongoDB + NodeJS
如果有的话,我会把这个问题标记为C而不是C++。 –