如果我使用写()字节写入套接字文件描述符,
例如:
write(fd, 'a', 1);
write(fd, 'b', 1);
write(fd, 'c', 1);这会不会比说的更有效率
write (fd, 'abc', 3);发布于 2011-02-14 02:31:05
不,不是每个字节都会变成一个数据包。有些可能是由于Nagle的算法和其他原因而合并的。每个数据包将有一个TCP报头,而不是每个字节。
也就是说,您应该避免逐字节调用写/发送,因为每个调用都是一个系统调用,这是昂贵的(在本地机器上,而不是在网络上结束的方式)。
发布于 2011-02-14 02:36:39
添加到John的答案,您可以禁用Nagle的算法(通过TCP_NODELAY),然后第一个版本将变得更慢。
相反,您可以调用writev()而不是write(),这将导致第一个版本与第二个版本完全相同。
发布于 2011-02-14 02:37:29
它实际上取决于TCP/IP堆栈的实现。这将真正取决于在操作系统中实现的分段。大多数OSes已经内置了许多优化。
如果您正在查看最坏的情况,TCP报头是20字节,IP报头是20字节,并且帧头的大小(取决于您使用的协议,可能是以太网),那么您可以期望它加上有效负载。尽管如此,internet中的大多数流量都是由ACK控制的,但是,您的网络堆栈应该合并有效载荷。
https://stackoverflow.com/questions/4988358
复制相似问题