C почему простые fgets в txt-файле потребляют много ресурсов процессора? - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть файлы субтитров / srt с данными, генерируемыми вторым. Я пытаюсь извлечь данные из них и сохранить их в текстовые файлы в цикле while (1) это простая операция чтения и записи текста.

Но я обнаружил, что использование fgets для обхода файла приводит к тому, что эта простая операция имеет очень высокую загрузку ЦП (команда top). Чем больше количество феттов выше использование процессора.

Кодовый бит:

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 МБ на файл), простая операция ввода / вывода в текстовом файле не должна потреблять слишком много ресурсов процессора.

этот базовый файловый ввод-вывод (1) такого языка, как python, показывает использование процессора только на 2-3%. но это в c показывает около 30% использования процессора. Как я могу уменьшить использование процессора без использования сна. есть ли альтернатива fgets процессору?

1 Ответ

3 голосов
/ 21 февраля 2012

Я не вижу здесь ничего плохого или странного.

Ваш основной цикл while(1) никогда не останавливается, что означает, что вы конвертируете свои файлы снова и снова.Файлы кэшируются ОС, поэтому вы не обращаетесь к своим физическим дискам.Таким образом, программа тратит почти все процессорное время на strlen(cap_nxt_tmp), и вы наблюдаете очень высокую загрузку процессора.

...