Если вы не используете 100% ЦП, значит, вы связаны с вводом / выводом и не увидите большого / какого-либо улучшения благодаря многопоточности - у вас будет несколько потоков, ожидающих ввода / вывода. На самом деле, если они обращаются к разным частям файла, вы можете ввести поиск дисков и сделать все намного хуже.
Сначала рассмотрим более простые вещи: можете ли вы увеличить объем буферной памяти, доступной для ввода / вывода? (например, в C ++ стандартные буферы ввода / вывода для объектов FILE крошечные (например, 4 КБ), установка большего буфера (например, 64 КБ) может существенно повлиять на пропускную способность).
Можете ли вы использовать больший размер буфера в ваших запросах ввода / вывода: например, Считайте 64 КБ необработанных данных в большой буфер, а затем обработайте их самостоятельно, вместо того, чтобы читать по одной строке или одному байту за раз.
Вы выводите какие-либо данные? Кэшируя это в ОЗУ вместо того, чтобы записывать его немедленно на диск, вы можете ограничить свой ввод-вывод простым чтением входного файла и помочь вещам идти намного быстрее.
Вы можете обнаружить, что, загружая большие буферы данных, вы начинаете связываться с процессором, и в этот момент вы можете подумать о многопоточности - один поток для чтения данных и другой поток (ы) для его обработки.