In my experience, non-blocking winsock operations are a bit slower, but much more scalable. The fact is that you need to make two system calls plus some scheduling at the application level when you perform non-blocking I / O (with IOCP) and one system call if you use blocking I / O. If you have many concurrent connections, non-blocking I / O is much faster due to the more scalable architecture if it is well implemented.
If you need to transfer data from point to point with maximum throughput, use blocking I / O. If you need to handle many concurrent client connections, use non-blocking I / O. Do not expect too much from any of them.
In general, we are talking about a "server architecture controlled by events and flows", and then "lock against non-blocking". In any situation, there is no universal server architecture. It depends on the application.
source share