Очень медленное создание образа диска (iso 9660) в C - PullRequest
0 голосов
/ 30 марта 2011

В качестве веселого проекта я подумал, что напишу программу для создания iso-файлов.Насколько я могу сказать, это работает, но читает только 4 КБ каждые 30 секунд.Я использовал eject -x 11, чтобы замедлить мой привод cdrom до разумной скорости.Без этого привод работает на полной скорости и довольно быстро убивает процесс.Будем очень благодарны за любые предложения, чтобы сделать это быстрее / лучше.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFFSIZE 4092

int main(int argc, char **argv)
{
    FILE *fp = fopen("/dev/cdrom", "r");
    FILE *file = fopen(strcat(argv[1], ".iso"), "w");

    printf("Copying...\n");

    while(!feof(fp))
    {
        char *line=(char *)malloc(sizeof(char) * BUFFSIZE);
        fgets(line, BUFFSIZE, fp);
        fprintf(file, "%s",line);

        free(line);
    }//end while

    fclose(fp);
    fclose(file);

    printf("Done!\n");

    return 0;
}//end main

Ответы [ 5 ]

3 голосов
/ 30 марта 2011

fgets() обрабатывает текст и ориентирован на строки, и тратит время на поиск новых строк.Кроме того, он и fprintf() не обрабатывают NUL байтов и могут очень запутаться ими.Вы хотите использовать двоичный ввод-вывод, то есть fread() и fwrite().Также нет необходимости постоянно free() и перераспределять ваш буфер.

Если вы хотите использовать примитивы Unix IO вместо оболочек C, вы можете использовать read() и write() или mmap().

1 голос
/ 30 марта 2011
  • Буферный ввод-вывод вряд ли уместен в этот сценарий, ни Fgets, который сканирует ввод для новой строки. Посмотрите в mmap .
  • Непрерывный буфер перераспределение замедляет работу.
  • Fprintf не подходит для записи двоичных данных. Это также медленно.
0 голосов
/ 30 марта 2011

Прежде всего, я не пошел бы с форматированным вводом (fgets и текстовый режим), но с необработанным двоичным вводом (fopen с флагом b, fread и fwrite для записи),Таким образом, stdio не нужно выполнять замены, необходимые для текстового режима (если это необходимо на вашей платформе), и у вас есть серия операций чтения фиксированного размера, которые должны работать лучше, чем fgets ', ожидая \n.

Тогда я бы избавился от этого динамического выделения памяти;непрерывное распределение / освобождение, вероятно, снижает производительность вашего приложения.Просто выделите один раз для всего статического буфера в стеке (например, 8192 байта) и используйте его все время.

0 голосов
/ 30 марта 2011

Переместите malloc и free за пределы цикла.

0 голосов
/ 30 марта 2011

Я не гуру C, но звучит так, как будто вам нужно реализовать некоторую форму буферизованных читателей и записчиков данных, чтобы увидеть улучшения производительности.

...