В вашем примере медленная часть, скорее всего, повторные вызовы getline()
. Хотя это в некоторой степени зависит от реализации, обычно вызов getline
в конечном итоге сводится к вызову ОС для извлечения следующей строки текста из открытого файла. Вызовы ОС стоят дорого, и их следует избегать в тесных циклах.
Рассмотрим реализацию getline
, которая требует ~ 1 мс служебной информации. Если вы называете это 1000 раз, каждое чтение ~ 80 символов, вы получаете полную секунду служебной информации. С другой стороны, если вы вызываете его один раз и читаете 80 000 символов, вы удалили 999 мс служебной информации, и функция, скорее всего, вернется почти мгновенно.
(Это также одна из причин, по которой игры и тому подобное реализуют пользовательское управление памятью, а не просто malloc
и new
повсеместно.)
Для чтения: Прочитать весь файл сразу, если он уместится в памяти.
См .: Как мне прочитать весь файл в std :: string в C ++?
В частности, см. slurp
ответ внизу. (И принимайте близко к сердцу комментарий об использовании std::vector
вместо char[]
массива.)
Если он не все умещается в памяти, управляйте им большими кусками.
Для записи: создайте свой вывод в stringstream
или аналогичном буфере, а затем запишите его за один шаг или большими кусками, чтобы минимизировать количество обращений ОС.