C 为什么不同的测试有完全相同的数字?

C 为什么不同的测试有完全相同的数字?,c,performance,testing,buffer,microbenchmark,C,Performance,Testing,Buffer,Microbenchmark,为什么缓冲0.030000秒与“更好”缓冲0.030000秒相同?如果4倍大的线路尺寸不会改变时间,我怎样才能加快速度呢 试验 代码 #包括 #包括 #包括 #定义大小1024/*一次读取1024字节*/ #定义betterSIZE 4096/*一次读取一个更好的大小*/ int copy()/*input2outie anything to anything*/ { char-buf[betterSIZE]; int n; 而((n=read(0,buf,betterSIZE))>0) 写入(

为什么缓冲0.030000秒与“更好”缓冲0.030000秒相同?如果4倍大的线路尺寸不会改变时间,我怎样才能加快速度呢

试验

代码

#包括
#包括
#包括
#定义大小1024/*一次读取1024字节*/
#定义betterSIZE 4096/*一次读取一个更好的大小*/
int copy()/*input2outie anything to anything*/
{
char-buf[betterSIZE];
int n;
而((n=read(0,buf,betterSIZE))>0)
写入(1,buf,n);
返回0;
}
int main(int argc,字符**argv)
{
/*复制()*/
/*公布姓名*/
无效信息(字符文件名[]);
无效缓冲(字符文件名[]);
作废更好的缓冲(字符文件名[]);
/*试验*/
时钟toc;
时钟=时钟();
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
toc=时钟();
printf(“无缓冲:%f秒\n”,(双精度)(toc-tic)/时钟每秒);
tic=时钟();
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
toc=时钟();
printf(“缓冲:%f秒\n”,(双精度)(toc-tic)/每秒时钟数);
tic=时钟();
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
toc=时钟();
printf(“更好的缓冲:%f秒\n”,(双精度)(toc-tic)/每秒时钟数);
返回0;
}
无效信息(字符文件名[])
{
int-ch;
文件*fp;
fp=fopen(文件名,“r”);
//读取模式
如果(fp==NULL)
{
perror(文件名);
退出(退出失败);
}
而((ch=fgetc(fp))!=EOF)
{
//putchar(ch);
}
fclose(fp);
}
无效缓冲(字符文件名[])
{
字符buf[大小];
文件*fp;
尺寸(单位:nread);
fp=fopen(文件名,“r”);
if(fp){
而((nread=fread(buf,1,sizeof buf,fp))>0)
{
//fwrite(buf,1,nread,stdout);
}
if(费罗(fp)){
/*要做的事情:处理错误*/
}
fclose(fp);
}
}
void缓冲区更好(char文件名[])
{
char-buf[betterSIZE];
文件*fp;
尺寸(单位:nread);
fp=fopen(文件名,“r”);
if(fp){
而((nread=fread(buf,1,sizeof buf,fp))>0)
{
//fwrite(buf,1,nread,stdout);
}
if(费罗(fp)){
/*要做的事情:处理错误*/
}
fclose(fp);
}
}

fread
已经对数据进行了缓冲,即在内部以块的形式读取数据,通常大小为4K或8K(确切的默认缓冲区大小由实现定义)。因此,将读取从1K切换到4K没有任何作用,因为它只会减少
memcpy
操作的数量,这些操作非常便宜,不需要在上述统计噪声的基准中注册

要影响
stdio
缓冲区的大小,请查看


此外,您正在更改的不是行大小,因为您不是逐行读取文件,而是块大小。

无论如何,操作系统都会从HD读取整个块,足以填充a,然后将其缓存一段时间。
所以读1024或4096并不重要。一页通常是4096页

如果你想加快阅读速度,试着一起读几页。例如8页

#define PAGE_SIZE 4096
#define betterSIZE 8*PAGE_SIZE 

stdio库本身实现了一个缓冲区,因此这两个函数本质上是相同的,它们使用库实现的相同大小的缓冲区

#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);
    }
}
#define PAGE_SIZE 4096
#define betterSIZE 8*PAGE_SIZE