所以(只是为了好玩),我试图编写一个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文件在一台2.10GHz的core2Duo T6500 Dell Inspiron笔记本电脑上运行时间为140毫秒。然而,当我尝试使用fread
/fwrite
时,随着每次调用传输的字节数(即下面代码中的变量st
)不断增加,运行时间逐渐减少,直到峰值约为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
。
feof()
函数只在读取失败后才会返回true,因此你的循环会将最后一个字符/块写入输出文件两次。 - cafclock
不是一种有效的测量时间的方法。它的结果在某种程度上是由实现定义的,在 POSIX 系统上,它返回进程使用的 CPU 时间而不是真实时间,当涉及到输入/输出时,这可能会产生很大的差异。应该使用clock_gettime
(或gettimeofday
)代替。 - R.. GitHub STOP HELPING ICEcmp
命令可以更加确信地验证完整性。 - R.. GitHub STOP HELPING ICEclock
运行良好,因为这不是一个多线程程序。当涉及到使用 pthreads 时,它就毫无用处了。 - Laksith