【发布时间】:2011-11-24 00:20:47
【问题描述】:
所以(只是为了好玩),我只是想写一个 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
【问题讨论】:
-
您说您的代码复制一个文件,但生成的文件将不等于您的原始文件。您的代码使用了错误的复制模式。
-
您能详细说明一下吗?我复制了一张图片并能够打开副本....与 hdf5 文件相同
-
@pratikm:@Roland Illig 指的是
feof()仅在读取失败后返回true,因此您的循环写入最后一个字符/块输出文件两次。 -
如果还应注意
clock不是一种有效的时间测量方法。它的结果在某种程度上是实现定义的,在 POSIX 系统上,它返回进程使用的 cpu time 量,而不是 real time 的量 - 这可以当涉及 IO 时会产生很大的不同。请改用clock_gettime(或gettimeofday)。 -
cmp将是确定性验证完整性的更好方法。
标签: c performance