gpt4 book ai didi

c - C中socket recv的char连接操作效率最大化

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:56 25 4
gpt4 key购买 nike

我试图最大限度地提高从套接字接收到的充满数据的缓冲区并将其复制到全局字符数组 xmlResponce[35000] 时的效率。

    char buf[2048];
if (sendResponce != -1)
{
int bytes;
memset(buf, '\0', 2048);
while((bytes = recv(sockfd, buf, 2047, 0)) > 0)
{
buf[bytes] = '\0';
strcat(xmlResponce, buf);
}
}

我特别关心最小化内存碎片,因为我在 Linux 内核 2.6.27 上有一些问题。有没有更有效的方法来做到这一点?使用 strcat 是否是从缓冲区复制到主字符数组的正确选择?

最佳答案

首先,我认为您可能想多了。内核内存碎片(如您对内核的引用所示)是物理 RAM 的碎片,这意味着伙伴算法无法分配物理上连续的页面。但是,由于您的内存是虚拟内存,这并不重要,因为虚拟连续内存不需要在物理上连续。虚拟内存碎片取决于您如何在用户空间(libc 或其他)中分配页面。

如果您真的担心虚拟内存碎片,请使用 mmap( ... MAP_ANON ... ) 分配一个大数组。让它比你可能需要的大(它实际上不会消耗物理内存,直到你写入或读取每个页面),然后 mremap 如果你需要扩展它的两倍大小这。如果您查看 man mallopt(特别是 M_MMAP_THRESHOLD),您会发现 malloc() 将为您完成所有工作,如果您使原来的配置不够大。所以我建议您只分配一个大缓冲区(如果您愿意,可以分配 35000 字节),然后如果您要溢出它,请将大小加倍。

现在,如何将字节写入缓冲区?

不要使用strcat。只需将它们直接写入缓冲区即可。根本不需要复制东西。这是一些未经测试的代码。

ssize_t offset = 0;

....

if (sendResponce != -1)
{
ssize_t bytes;
while((bytes = recv(sockfd, xmlResponse+offset, 65536, 0)) > 0)
{
offset += bytes;
}
}

xmlResponse[offset] = 0;

请注意,为了提高效率,我已将 recv 的大小增加到 65536 字节。这意味着通常您会在一个电话中得到它。

不要忘记检查你没有写超出缓冲区的末尾。为了清楚起见,我将其省略。

关于c - C中socket recv的char连接操作效率最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28616797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com