C 缓慢的缓冲区访问 [已关闭]

C slow buffer access [closed]

提问人:Erz 提问时间:10/24/2023 更新时间:10/24/2023 访问量:39

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

上个月关闭。

我有两个具有类似任务的代码片段。

以下代码需要 4 秒:

while(1)
{
    fputs(erz_aint2hex(buffer[write_helper++]), fp);
    if(write_helper > _size) { if(enable_output) erz_output(white, LOCAL_FUNCTION_NAME, "Write data to file\r\n"); break; }
}

第二个代码需要 15 分钟以上:

while(1)
{
    strcat(buf_ret, (erz_aint2hex(buffer[write_helper++])));            
    if(write_helper > _size) { if(enable_output) erz_output(white, LOCAL_FUNCTION_NAME, "Write data to buffer\r\n"); break; }
}

buf_ret并且是 malloc char 数组。第一个代码以十六进制格式将任何输入文件转换为新文件。第二个代码执行相同的操作,但将内容存储在缓冲区中。输入文件有 7mb 并转换为 15mb。为什么第二个代码这么慢?我能做些什么来让它更快?buffer

我也试过了. 这么慢吗?snprintf(hexhelper, sizeof(hexhelper), "%X", buffer[write_helper++]);strncat()strcat()

C 64 位

评论

0赞 Brian61354270 10/24/2023
您是否阅读过 strcat 功能的描述?

答:

1赞 AKX 10/24/2023 #1

strcat每次调用都需要查找包含在中的字符串的末尾(即尾随的 null 字节),所以是的,增长时间越长,速度越慢。buf_retbuf_ret

类似的东西

char *buf_w = buf_ret;
while (1) {
  char *hex = erz_aint2hex(buffer[write_helper++]);
  *buf_w++ = hex[0];  // assumes hex is 
  *buf_w++ = hex[1];  // 2 bytes long

  if (write_helper > _size) {
    if (enable_output)
      erz_output(white, LOCAL_FUNCTION_NAME, "Write data to buffer\r\n");
    break;
  }
}

可能会快得多。(YMMV,请注意,这里没有边界检查。

评论

0赞 Erz 10/24/2023
谢谢,这解决了它。我没有考虑过strcat检查整个缓冲区..