我有字幕/ 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?
答案 0 :(得分:3)
我在这里看不到任何错误或奇怪的事。
您的主while(1)
循环永不停止,这意味着您一遍又一遍地转换文件。文件由操作系统缓存,因此您无法真正访问物理驱动器。因此,程序几乎花费了所有CPU时间strlen(cap_nxt_tmp)
,并且您观察到非常高的CPU负载。