gpt4 book ai didi

c - C中fgetc/fputc和fread/fwrite的速度比较

转载 作者:太空狗 更新时间:2023-10-29 16:57:59 25 4
gpt4 key购买 nike

所以(只是为了好玩),我只是想写一个 C 代码来复制一个文件。我四处阅读,似乎所有从流中读取的函数调用 fgetc()(我希望这是真的?),所以我使用了该函数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FILEr "img1.png"
#define FILEw "img2.png"
main()
{
clock_t start,diff;
int msec;
FILE *fr,*fw;
fr=fopen(FILEr,"r");
fw=fopen(FILEw,"w");
start=clock();
while((!feof(fr)))
fputc(fgetc(fr),fw);
diff=clock()-start;
msec=diff*1000/CLOCKS_PER_SEC;
printf("Time taken %d seconds %d milliseconds\n", msec/1000, msec%1000);
fclose(fr);
fclose(fw);
}

这为 this 提供了 140 毫秒的运行时间2.10Ghz core2Duo T6500 Dell inspiron 笔记本电脑上的文件。但是,当我尝试使用 fread/fwrite 时,随着我不断增加字节数(即变量 st in以下代码)为每个调用传输,直到它在 10 毫秒左右达到峰值!这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FILEr "img1.png"
#define FILEw "img2.png"
main()
{
clock_t start,diff;
// number of bytes copied at each step
size_t st=10000;
int msec;
FILE *fr,*fw;
// placeholder for value that is read
char *x;
x=malloc(st);
fr=fopen(FILEr,"r");
fw=fopen(FILEw,"w");
start=clock();
while(!feof(fr))
{
fread(x,1,st,fr);
fwrite(x,1,st,fw);
}
diff=clock()-start;
msec=diff*1000/CLOCKS_PER_SEC;
printf("Time taken %d seconds %d milliseconds\n", msec/1000, msec%1000);
fclose(fr);
fclose(fw);
free(x);
}

为什么会这样?也就是说,如果 fread 实际上是对 fgetc 的多次调用,那么为什么会有速度差异?编辑:指定“增加字节数”是指第二个代码中的变量 st

最佳答案

fread() 没有调用 fgetc() 来读取每个字节。

它的行为就好像重复调用fgetc(),但它可以直接访问fgetc() 从中读取的缓冲区,所以它可以直接复制更大数量的数据。

关于c - C中fgetc/fputc和fread/fwrite的速度比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250889/

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