Так что (просто для удовольствия) я просто пытался написать C-код для копирования файла. Я читаю вокруг, и кажется, что все функции для чтения из потока вызывают fgetc()
(надеюсь, это правда?), Поэтому я использовал эту функцию:
#include
#include
#include
#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);
}
Это дало время выполнения 140 мсек для этого файла на ноутбуке Dell inspiron 2,5 ГГц core2Duo T6500. Однако, когда я пытаюсь использовать fread
/ fwrite
, у меня уменьшается время выполнения, так как я продолжаю увеличивать количество байтов (т. Е. Переменную st
в следующем коде), передаваемых для каждого вызова, до тех пор, пока оно не достигнет пика около 10 мс! Вот код:
#include
#include
#include
#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
во втором коде