производительность — C ++ Что-то лучше, чем fgetc?

У меня есть огромный файл, который я читаю с fopen & Fgetc в цикле.

Чтение всего файла с флагом «rb» в fopen занимает около 6 секунд, в файле около 25 тыс. Строк.

Я размышлял; что быстрее, чем fgetc? лучше сначала загрузить все в массиве char *? лучше strcpy?

  • обратите внимание, что лучше, если это будет способ fgetc, или я смогу по крайней мере получить символ char в массиве.

  • что может быть лучше, чем fgetc?

0

Решение

Что ж, fgetc уже в значительной степени оптимизирован, потому что он использует базовую буферизацию fopen. Просто вы вызываете функцию (но не системный вызов) для каждого символа. Вы можете попытаться увеличить размер буфера (как вы говорите, вы читаете огромные файлы) с помощью setbuffer:

#define SIZE 65536
// or use even greater size if appropriate ...
char buffer[SIZE];

fd = fopen(...);
setbuffer(fd, buffer, SIZE);

В качестве альтернативы, вам нужно читать символ на символ?

1

Другие решения

Если файл представляет собой текстовый файл, он, вероятно, состоит из строк разумного размера. Затем вы можете попытаться прочитать его построчно, например, с станд :: GetLine (или, в C, GetLine (3))

Если вы используете систему Posix, например, Linux, вы могли бы использовать низкоуровневый Системные вызовы (2) лайк чтения (2) или же ММАП (2). Убедитесь, что у вас достаточно большие буферы, например 16 КБ или 64 КБ.

Кстати, если на Linux, попробуйте time wc yourbigfile, он должен дать вам представление о нижней границе времени, фактически необходимого для чтения вашего файла. Помните, что есть кеш файловой системы: смотрите http://linuxatemyram.com/ для большего.

в моей настольной системе Linux wc из 6 Мбайт, файл 100Klines занимает около 0,1 секунды в реальном времени.

Возможно, прочитал Расширенное программирование в Linux, по крайней мере, если вы запускаете свою программу в системах Posix.

Кстати, ваш вопрос касается операционной системы и, возможно, конкретной файловой системы.

0

Вся проблема с моим кодом заключалась в том, что я использовал fget_pos и fset_pos каждый раз, когда хотел «вернуть» символ, был ungetc, который значительно увеличивает скорость!

0
По вопросам рекламы [email protected]