对于网络编程中,一般都喜欢使用memset清0和memcpy拷贝操作,举个例子:
char
要写出高性能的后台服务程序,必须避免不必要的内存操作:
1. 对于这里的memset,完全没有必要,就算buffer里面有脏数据,我们在拷贝的过程中也把脏数据都覆盖了,然后调用send的时候也给了实际数据的长度。
2. 对于这里的memcpy,使用了3次拷贝构造一个完整的包然后发送,我们可以使用sendmsg接口进行优化:
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
这里看下msghdr的结构
struct msghdr
{
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
size_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags (unused) *