LINUX.ORG.RU

Медленное копирование файла


0

1

Требуется сделать копию файла. Я делаю это с помощью 10ти потоков(функция потока привел ниже). Проблема в том, что скорость копирования на порядок ниже чем у утилиты cp. В чем может быть причина проблемы?

struct argument {
   FILE *fin, *fout;
   bool done;
} argument;

void *tread_function(void *arg) {
   struct argument *p = (struct argument *)arg;
   FILE *fin = p->fin, *fout = p->fout;
   signed char byte;
   do {
      sem_wait(&semaphore);
      byte = fgetc(fin);
      if (!feof(fin)) fputc(byte, fout);
      sem_post(&semaphore);
   } while (!feof(fin));
   p->done = 1;
}

Ты серьезно или прикалываешься?

arturpub ★★
()

А почему должно быть быстрее? Это не тот случай, где распараллеливание идет на пользу. А еще копировать файл по одному байту неэффективно, лучше использовать блоки большого размера.

amomymous ★★★
()

Требуется сделать копию файла. Я делаю это с помощью 10ти потоков(функция потока привел ниже). Проблема в том, что скорость копирования на порядок ниже чем у утилиты cp. В чем может быть причина проблемы?

в голове. Во сколько потоков копировать, должна решать ОС, а не твоё приложение. Делай в один поток, ОС сама разберётся.

А ещё ты семафор на каждый байт дрочишь. Странно, что на порядок, а не в Over9000 раз...

emulek
()
Ответ на: комментарий от amomymous

А еще копировать файл по одному байту неэффективно

для fgetc(3) разницы нет особой. Там внутри буфер есть. Т.ч. про «блоки» ты не прав(единственное, он семафор блочит на каждый байт зачем-то).

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.