0

buffered 0.030000 seconds が「より良い」 buffered 0.030000 seconds と同じなのはなぜですか? ラインサイズを 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

3 に答える 3

4

freadすでにデータをバッファリングしています。つまり、通常は 4K または 8K のサイズのチャンクで内部的に読み取ります (正確なデフォルトのバッファ サイズは実装によって定義されます)。このため、読み取りを 1K から 4K に切り替えても、memcpy操作の数が減少するだけであり、統計的ノイズを超えるベンチマークに登録されないほど安価であるため、何もしません。

stdioバッファのサイズに影響を与えるには、 を見てくださいsetbuf

また、ファイルを 1 行ずつ読み取っているのではなく、チャンク サイズであるため、変更しているのは行サイズではありません。

于 2013-03-08T09:51:14.677 に答える
3

OSはとにかくHDからブロック/セクター全体を読み取り、ページを埋めるのに十分であり、しばらくの間それをキャッシュします。
したがって、1024と4096のどちらを読んでもかまいません。通常、ページは4096です。

スピードを上げたい場合は、一緒に数ページ読んでみてください。たとえば8ページ。

#define PAGE_SIZE 4096
#define betterSIZE 8*PAGE_SIZE 
于 2013-03-08T09:54:29.880 に答える
1

stdioライブラリはそれ自体でバッファを実装します。したがって、2つの関数は基本的に両方と同じであり、ライブラリによって実装されたものと同じサイズのバッファを使用します。

于 2013-03-08T09:54:59.197 に答える