【发布时间】: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