windows - socket 乒乓性能

标签 windows performance sockets

我写了两个简单的程序(在 C++ 和 C# 中试过)。

这是伪代码:

-------- 客户端----------------

for(int i = 0; i < 200.000; i++)  
{  
    socket_send("ping")  
    socket_receive(buff)  
}  

------------ 服务器------------

while(1)  
{  
    socket_receive(buff)  
    socket_send("pong")  
}  

我在 Windows 上试过了。

客户端的执行时间约为45秒。有人能解释一下为什么这需要这么长时间吗? 我知道如果客户端和服务器之间存在真正的网络连接,那么一个“乒乓球”的时间将是: generate_ping + send_via_network + generate_pong + send_via_network 但这里的一切都是在“本地”模式下完成的。

有什么方法可以使用网络套接字使这个进程间乒乓球更快(例如,我不是在问共享内存:))

最佳答案

这可能是 nagle 问题吗?您发送非常小的数据包,然后立即等待响应。 TCP 堆栈会暂时保留数据,直到确定您不会再发送任何数据为止。设置 TCP_NODELAY 选项可能会使其更快。

虽然这个假设让我感到困惑的是为什么没有其他人看到它以及为什么在 linux 上看不到相同的效果(我对此几乎一无所知)。我确实知道 Windows 上的 TCP 堆栈通常几乎肯定不会比 Linux 上的堆栈慢 9 倍 - 有人会注意到。

关于windows - socket 乒乓性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2835138/

相关文章:

c - 从 Windows 剪贴板获取 32 位 RGBA 图像

performance - 如何减慢 MS-Access 中宏的执行速度

C++ 如何通过套接字(TCP)进行二进制序列化

Java 套接字在 LAN 上工作,但不能在 Internet 上工作?

python - 如何创建一个子进程可以读取的临时文件?

python - GPU计算能力3.0,但最低要求的Cuda能力为3.5

windows - 在批处理脚本中,如何获取文件的长名称?

Python 读取极长行文件的性能

wpf - 哪个重量最轻 : Canvas or Grid?

sockets - Linux中AF_UNIX数据报消息的最大大小是多少?