【问题标题】:C why does a simple fgets on a txt file consume high cpu usage?C 为什么txt文件上的简单fgets会消耗很高的cpu使用率?
【发布时间】:2012-02-21 13:06:19
【问题描述】:

我有第二个生成数据的字幕/srt 文件。我正在尝试从中提取数据并将它们保存到文本文件中 在 while(1) 循环中,它是一个简单的文本读写操作。

但我发现使用 fgets 遍历文件导致这个简单的操作具有非常高的 cpu 使用率(top 命令参考)。越多 fget 的数量越高 cpu 使用率。

代码位:

int convert_to_txt(FILE *f1, FILE *f2) {

    static int str_len = 0;
    char cap_nxt_tmp[128];

    while (fgets(cap_nxt_tmp, 128, f1) != NULL) {

        fprintf(f2, "%s\n", cap_nxt_tmp);
    }
    return 0;
}

int main(int argc, char* argv[]) {
    FILE *inputFilePtr;
    FILE *outputFilePtr;

    char inputPath[1024] = "storage/sample.srt";
    char outputPath[1024] = "storage/sample.txt";
    while (1) {

        outputFilePtr = fopen(outputPath, "w");
        inputFilePtr = fopen(inputPath, "r");
        if (inputFilePtr == NULL || outputFilePtr == NULL) {
            perror("Error");
        }
        convert_to_txt(inputFilePtr, outputFilePtr);
        fclose(inputFilePtr);
        fclose(outputFilePtr);
        // theres a break on an end condition lets say least run time is an hour.
    }
    return 0;
}

我无法理解我使用 fgets 读取 srt/captions 文件(每个文件 1-2 mb)的方式出了什么问题,一个简单的文本文件 i/o/读取操作不应该消耗太多的 cpu 使用率。

这个基本文件 i/o 在像 python 这样的语言的 while(1) 中仅显示 2-3% 的 cpu 使用率。 但这在 c 中显示了大约 30% 的 cpu 使用率。 如何在不使用 sleep 的情况下减少 cpu 使用率。有没有比 fgets 更少的 cpu 替代品?

【问题讨论】:

  • 这里的问题是你在做一个永无止境的循环。您的程序将尽可能努力地工作,除非它必须阻塞某些东西,否则它将继续尽可能多地占用 CPU 时间。
  • while(1) 实际上由带有 break 的“进程结束时间”终止。假设这运行了一个小时。

标签: c linux file-io cpu-usage fgets


【解决方案1】:

我没有看到任何错误或奇怪的地方。

您的主要while(1) 循环永远不会停止,这意味着您正在一遍又一遍地转换文件。文件被操作系统缓存,所以你并没有真正访问你的物理驱动器。因此,该程序几乎将所有 CPU 时间都花在了 strlen(cap_nxt_tmp) 上,并且您会观察到非常高的 CPU 负载。

【讨论】:

  • 程序可能必须等待文件更改才能解析它。
  • 是的,但这是一个简单的文本文件操作。在 python 中做同样的事情,cpu 使用率非常低。我怎样才能在没有睡眠的情况下减少这个运行中的负载。
  • @AdityaGameProgrammer 你应该弄清楚这两个程序中哪个更快。测量 C 程序处理 1000 个文件需要多长时间。测量python程序处理1000个文件需要多长时间。将您的程序调整到您需要的频率(带睡眠)。低 CPU 使用率可能并不意味着您的 python 程序更快...
  • @AdityaGameProgrammer:我不认为你可以。通过在永无止境的while(1) 中执行 CPU 密集型操作,您正在以最大容量加载 CPU,但这是正常。如果您不想消耗 CPU 周期,那么就不要这样做。无论如何,我认为无限转换同一个文件没有任何意义。在现实生活中,您可能会转换不同的文件,执行一些 I/O 等操作。
  • 并非如此。您可能会使用 fread()。但它解决了一个不同的问题, fgets 给你行, fread() 给你数据块。如果需要读行,使用 fgets(),否则使用 fread()。
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2022-11-18
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多