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

标签 c performance testing buffer microbenchmark

为什么缓冲 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);
    }
}

最佳答案

fread 已经缓冲数据,即在内部以通常大小为 4K 或 8K 的 block 读取数据(确切的默认缓冲区大小由实现定义)。出于这个原因,将您的读取从 1K 切换到 4K 没有任何作用,因为它只会减少 memcpy 操作的数量,这些操作足够便宜,不会在统计噪声以上的基准中注册。

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

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

关于c - 为什么不同的测试有完全相同的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290944/

相关文章:

无法让我的程序加载文本文件

postgresql - PostgreSQL图邻居查询速度慢

angularjs - 有效识别元素 - AngularJS Automation with Ranorex

c - 如何类型转换 void 指针?

c++ - 从 c++/c 中的函数返回的问题

c - LAPACKE矩阵求逆分段故障C

testing - Gemini 和 SpiraTest 交互

java - 建立与mysql数据库的连接(关于优化的问题)

c++ - 为什么将可视化调试器附加到我的程序比直接从 visual studio 运行它更快?

ruby-on-rails - 在 Rails 集成测试中验证 Controller 分配的变量