2012-02-21 26 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

相關問題