2013-03-08 4 views
0

Почему буферизировано 0.030000 секунд так же, как «лучше» буферировано 0.030000 секунд? Если в 4 раза больше строк не изменится время, как я могу ускорить его еще больше?Почему разные тесты имеют точно такое же число?

Тест

$ ./a.out 
Unbuffered: 0.770000 seconds 
Buffered: 0.030000 seconds 
Better buffered: 0.030000 seconds 

код

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define SIZE 1024 /* read 1024 bytes at a time */ 
#define betterSIZE 4096 /* read a better size at a time */ 

int copy() /* input2output ie anything to anything */ 
{ 
    char buf[betterSIZE]; 
    int n; 
    while ((n = read(0, buf, betterSIZE)) > 0) 
    write(1, buf, n); 
    return 0; 
} 

int main(int argc, char **argv) 
{ 

    /* copy(); */ 

    /* make the names known */ 

    void info(char file_name[]); 
    void buffered(char file_name[]); 
    void better_buffered(char file_name[]); 

    /* test */ 

    clock_t toc; 
    clock_t tic = clock(); 
    info("coreutils_8.13.orig.tar.gz"); 
    info("coreutils_8.13.orig.tar.gz"); 
    info("coreutils_8.13.orig.tar.gz"); 
    info("coreutils_8.13.orig.tar.gz"); 
    info("coreutils_8.13.orig.tar.gz"); 
    toc = clock(); 
    printf("Unbuffered: %f seconds\n", (double)(toc - tic)/CLOCKS_PER_SEC); 
    tic = clock();  
    buffered("coreutils_8.13.orig.tar.gz"); 
    buffered("coreutils_8.13.orig.tar.gz"); 
    buffered("coreutils_8.13.orig.tar.gz"); 
    buffered("coreutils_8.13.orig.tar.gz"); 
    buffered("coreutils_8.13.orig.tar.gz"); 
    toc = clock(); 
    printf("Buffered: %f seconds\n", (double)(toc - tic)/CLOCKS_PER_SEC); 
    tic = clock();  
    better_buffered("coreutils_8.13.orig.tar.gz"); 
    better_buffered("coreutils_8.13.orig.tar.gz"); 
    better_buffered("coreutils_8.13.orig.tar.gz"); 
    better_buffered("coreutils_8.13.orig.tar.gz"); 
    better_buffered("coreutils_8.13.orig.tar.gz"); 
    toc = clock(); 
    printf("Better buffered: %f seconds\n", (double)(toc - tic)/CLOCKS_PER_SEC); 
    return 0; 
} 

void info(char file_name[]) 
{ 
    int ch; 
    FILE *fp; 
    fp = fopen(file_name,"r"); 
    // read mode 
    if (fp == NULL) 
    { 
     perror(file_name); 
     exit(EXIT_FAILURE); 
    } 
    while ((ch = fgetc(fp)) != EOF) 
    { 
     //putchar(ch); 
    } 
    fclose(fp); 
} 

void buffered(char file_name[]) 
{ 
    char buf[SIZE]; 
    FILE *fp; 
    size_t nread; 
    fp = fopen(file_name, "r"); 
    if (fp) { 
     while ((nread = fread(buf, 1, sizeof buf, fp)) > 0) 
    { 
      //fwrite(buf, 1, nread, stdout); 
    } 
     if (ferror(fp)) { 
      /* to do: deal with error */ 
     } 
     fclose(fp); 
    } 
} 


void better_buffered(char file_name[]) 
{ 
    char buf[betterSIZE]; 
    FILE *fp; 
    size_t nread; 
    fp = fopen(file_name, "r"); 
    if (fp) { 
     while ((nread = fread(buf, 1, sizeof buf, fp)) > 0) 
    { 
      //fwrite(buf, 1, nread, stdout); 
    } 
     if (ferror(fp)) { 
      /* to do: deal with error */ 
     } 
     fclose(fp); 
    } 
} 

ответ

4

fread уже буферов данных, т.е. внутри считывает его на куски, как правило, 4K или 8K размера (точный размер буфера по умолчанию определяется реализацией). По этой причине переключение ваших чтений с 1K на 4K ничего не делает, так как это уменьшает количество операций memcpy, которые достаточно дешевы, чтобы не регистрироваться в контрольном знаке выше статистического шума.

Чтобы повлиять на размер буфера stdio, взгляните на setbuf.

Кроме того, что вы меняете, это не размер строки, потому что вы не читаете файл по строкам, а размер блока.

3

ОС будет читать целые блоки/sectors от HD в любом случае, достаточно, чтобы заполнить page, а затем кэширует это на некоторое время.
Так что неважно, читаете ли вы 1024 или 4096. Обычно страница 4096.

Если вы хотите ускорить ее, попробуйте прочитать несколько страниц вместе. 8 страниц, например.

#define PAGE_SIZE 4096 
#define betterSIZE 8*PAGE_SIZE 
1

из stdio.h библиотека реализует буфер сам по себе - так что две функции, по существу, такой же, как и с использованием того же размера буфера, реализованные в библиотеке.