сравнение скорости между fgetc / fputc и fread / fwrite в C

Так что (просто для удовольствия) я просто пытался написать 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 во втором коде

8
задан Born2Smile 7 September 2015 в 00:14
поделиться