提问人:Erz 提问时间:10/24/2023 更新时间:10/24/2023 访问量:39
C 缓慢的缓冲区访问 [已关闭]
C slow buffer access [closed]
问:
我有两个具有类似任务的代码片段。
以下代码需要 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()
答:
1赞
AKX
10/24/2023
#1
strcat
每次调用都需要查找包含在中的字符串的末尾(即尾随的 null 字节),所以是的,增长时间越长,速度越慢。buf_ret
buf_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检查整个缓冲区..
评论
strcat
功能的描述?