2013-03-08 54 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

操作系統將從HD讀取整個塊/ sectors,足以填充page,然後緩存一段時間。
因此,如果您讀取1024或4096,則無關緊要。頁面通常爲4096.

如果您想加快速度,請嘗試一起閱讀幾頁。例如8頁。

#define PAGE_SIZE 4096 
#define betterSIZE 8*PAGE_SIZE 
1

stdio庫本身實現了一個緩衝區 - 所以這兩個函數本質上與使用與庫實現的相同大小的緩衝區相同。

相關問題