从文件fgetc中读取Performace与读取整个字符串

时间:2019-04-17 13:04:59

标签: c string performance file io

我尝试检查哪种更快:

  1. 计算文件大小,将全部内容读取到字符串(char *),对字符串进行操作
    VS.
  2. 使用fgetc逐字符读取char并在单个char上进行操作。

我的结果说没有区别。你觉得呢?

  1. 什么才是真正的更快?
  2. 复杂性操作重要吗?
  3. od硬盘类型(HDD / SSD)重要吗?
  4. 第一种情况使用更多的内存,因此在大文件中会更糟,对吧?
  5. 文件较小时有差异吗?
  6. 操作系统重要吗? (我使用Linux Ubuntu 14)

我的下面的代码:

开始:

    size_t start = clock();
    volatile size_t some = 0;
    FILE* fh = fopen("/home/xxx/test/file.txt", "r");
  1. 案例
    size_t size = 0;
    fseek(fh, 0L, SEEK_END);
    size = ftell(fh);
    rewind(fh);
    char* result = (char*) malloc(sizeof(char) * (size + 1));
    fread((void*) result, sizeof(char), size, fh);
    result[size] = '\0';

    for (size_t i = 0; i < size; i++)
    {
        if (result[i] % 2)
        {
            some++;
        }
    }

    free(result);
  1. 案例
    int c = fgetc(fh);
    while (c != EOF)
    {
        if (c % 2)
        {
            some++;
        }

        c = fgetc(fh);
    }

结束:

    fclose(fh);
    size_t end = clock();
    printf("TIME = %zu\n", end - start);

在我的情况下,操作很简单,易失性会阻止编译器优化。

1 个答案:

答案 0 :(得分:1)

可能是文件的读取限制了性能,与读取文件相比,您对数据进行的操作成本可忽略不计。为了提高效率,最好以足够大的块为单位进行处理,因此原则上一次仅一个字节可能是不好的。

但是,在实践中,可能在后台进行了一些巧妙的缓冲。因此,即使您的程序一次只请求一个字节,实际上该文件也需要大块读取,从而为您提供与第一种方法大致相同的性能。

(上面的假设是文件的读取完全控制了成本。如果不是这种情况,并且如果内存访问速度很慢,则可能发生一次一字节的方法是更快,因为这种方法避免了两次访问同一部分内存。)