2012-02-21 27 views
0

我有字幕/ srt文件,数据由第二个生成。我试图从它们中提取数据,并在while(1)循环中将它们保存到文本文件 ,它是一个简单的文本读取和写入操作。C为什么txt文件上的简单fgets消耗高cpu使用量?

但我发现使用fgets来遍历文件导致这个简单的操作具有非常高的CPU使用率(顶级命令参考)。更多的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 /字幕文件(每个文件1-2 MB),一个简单的文本文件I/O方式/读操作不应该消耗太多的CPU使用。

这个基本文件I/O在像python这样的语言中只显示2-3%的CPU使用率。 但这在c显示约30%的CPU使用率。 如何在不使用睡眠的情况下减少CPU使用量。有更少的cpu替代fgets吗?

+0

这里有什么问题是你在一个永无止境的循环中做的。你的程序将尽可能地努力工作,除非它必须阻止某些事情,它会继续吸取尽可能多的CPU时间。 – 2012-02-21 13:19:16

+0

while(1)实际上终止于“进程结束时间”,并有一个中断。可以说这运行了一个小时。 – 2012-02-21 13:28:38

回答

3

我没有在这里看到任何错误或奇怪。

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

+0

该程序在解析之前可能需要等待文件更改。 – ydroneaud 2012-02-21 13:22:43

+0

是的,但这是一个简单的文本文件操作。在python中完成的同样的事情固定了一个非常低的CPU使用率。如何在没有睡眠的情况下减少运行中的负载。 – 2012-02-21 13:27:33

+1

@AdityaGameProgrammer你应该找出哪两个程序更快。测量C程序处理1000个文件需要多长时间。测量python程序处理1000个文件需要多长时间。调整你的程序到你需要的频率(睡眠)。低CPU使用率可能并不意味着你的Python程序更快... – nos 2012-02-21 13:33:36

相关问题