2013-03-08 27 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库本身实现了一个缓冲区 - 所以这两个函数本质上与使用与库实现的相同大小的缓冲区相同。

相关问题