Есть ли способ прочитать строку быстрее, чем getchar () (C / C ++)? - PullRequest
3 голосов
/ 21 января 2012

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

Я предполагаю, что чтение строк char за char с помощью getchar () - это самая быстрая процедура, которую вы можете выполнить. Это потому, что даже если вы используете другие функции, например, fgets () или getline (), эти функции все равно должны будут читать каждый символ в любом случае.

Обновление : я знаю, что ввод / вывод не будет узким местом в большинстве алгоритмических задач. При этом я все равно очень хотел бы знать, какой самый быстрый способ вы можете использовать для чтения строк, если это станет проблемой для любой будущей проблемы.

Ответы [ 2 ]

5 голосов
/ 21 января 2012

Вы можете использовать функцию std::istream::read() для чтения фрагмента неформатированных данных. Это относительно быстрее именно потому, что данные неформатированы . Все перегрузки operator>> чтения форматированных данных, что делает чтение из потока медленнее по сравнению с read().

Аналогичным образом, вы можете использовать функцию std::ostream::write() для одновременной записи фрагмента данных в выходной поток.

1 голос
/ 21 января 2012

Обратное верно: считывание больших объемов данных в память за один раз выполняется намного быстрее, чем чтение одного символа за раз.Операционная система и / или жесткий диск в любом случае также будут кэшировать данные, но только издержки вызова функции, связанные с многократным циклическим переключением между стандартной библиотекой, ОС, файловой системой и драйвером устройства для каждого символа, важны для больших наборов данных.

При обработке строк есть еще несколько важных проблем с производительностью, которые вы могли бы рассмотреть: Назад к основам от Джоэла Спольски

В любом случае, самый убедительный способОтветьте на вопрос для себя, чтобы написать тестовый код, который исследует разницу между различными методами ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...