C为什么txt文件上的简单fgets消耗高CPU使用率?

时间:2012-02-21 13:06:20

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

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

但我发现使用fgets遍历文件会导致这个简单的操作具有非常高的CPU使用率(top command ref)。更多的fgets数量更高 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 / read操作不应该消耗太多的cpu使用。< / p>

这个基本文件i / o在一段时间(1)的语言如python只显示2-3%的CPU使用率。 但这在c中显示大约30%的CPU使用率。 如何在不使用睡眠的情况下减少CPU使用量。是否有更少的cpu替代fgets?

1 个答案:

答案 0 :(得分:3)

我在这里看不到任何错误或奇怪的事。

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