recv效率低下的问题

我的小丫丫 2012-06-25 04:18:22
如题,我在 linux 下调用recv,执行2277000次,总耗时90139966微秒
平均下来是39微秒一次,这个效率貌似不是很高啊!
我对recv的socket设置了如下属性


int i_buffer_size = INT_MAX;

if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(const char*)(&i_buffer_size), sizeof(int)) == -1) {
LOG_MSG("Socket Error: Adjust SO_RCVBUF failed.%s", strerror(errno));
return false;
}

if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(const char*)(&i_buffer_size), sizeof(int)) == -1) {
LOG_MSG("Socket Error: Adjust SO_SNDBUF failed.%s", strerror(errno));
return false;
}

int bOptVal = 1;
int bOptLen = sizeof(int);
if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
(const char*)&bOptVal,bOptLen) == -1) {
LOG_MSG("Socket Error: Adjust SO_KEEPALIVE failed.%s", strerror(errno));
return false;
}

if (setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,
(const char*)&bOptVal,bOptLen) == -1) {
LOG_MSG("Socket Error: Adjust TCP_NODELAY failed.%s", strerror(errno));
return false;
}

if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,
(const char*)&bOptVal,bOptLen) == -1) {
LOG_MSG("Enable SO_REUSEADDR failed.%s", strerror(errno));
return false;
}

struct linger lgr;
memset(&lgr, 0x00, sizeof(struct linger));
lgr.l_onoff = 0;
if (setsockopt(sock, SOL_SOCKET, SO_LINGER,
(const char*)&lgr, sizeof(linger)) == -1) {
LOG_MSG("Socket Error: Adjust SO_LINGER failed.%s", strerror(errno));
return false;
}

// linux kernel introduced
bOptVal = 0;
if (setsockopt(sock, IPPROTO_TCP, TCP_CORK,
(const char*)&bOptVal, bOptLen) == -1) {
LOG_MSG("Socket Error: Adjust TCP_CORK failed.%s", strerror(errno));
return false;
}

// set socket to be non-blocking
int on = 1;
if (ioctl(sock,FIONBIO,(const char*)&on) < 0) {
LOG_MSG("Enable non-blocking mode failed.%s", strerror(errno));
return false;
}

return true;



在recv时使用的方式为


ret = recv(sock, (char*)((char*)(buf)+received), request,MSG_DONTWAIT);



求高人指点迷津,将recv的执行效率提上去
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
louyong0571 2012-06-26
  • 打赏
  • 举报
回复
这个跟网络环境也有关系啊,网络环境足够好吗?
wqkjj 2012-06-26
  • 打赏
  • 举报
回复
LZ希望达到一个什么级别的效果?IO在时间消耗方面向来是很昂贵的。
有些东西可能也就这个样子了,所以才会有什么异步IO的说法。
我的小丫丫 2012-06-25
  • 打赏
  • 举报
回复
测试过,每次都收到数据的,如果收不到数据会立即退出的
fdl19881 2012-06-25
  • 打赏
  • 举报
回复
请问是因为设置了你写的一些属性的原因导致的recv效率低呢, 还是本来没设置这么多属性时效率也低??
因为你一下拿出设置了这么多属性,然后说效率低。但什么才是影响他效率的主要原因呢?
如果是前者,那你考虑下把不需要设置的属性去掉。是否很有必要设置。如果是后者,可能就没办法了。


还有你测试的结果是recv每次都收到数据了吗? 因为你用的非阻塞模式,如果不是每次都收到数据,空转也要消耗系统时间。
或者你可以结合select,poll,epoll这些东西来使用就可以提高效率了。

只是提出下我的疑问,,具体得结合你自己的目的,程序代码来解决。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧