Причина, по которой fscanf так медленен, в основном из-за медленной загрузки памяти с жесткого диска.С кодом, который вы разместили, одна строка текста извлекается из файла, а затем анализируется с форматированием, которое вы дали.Это приводит к большому количеству выборки маленьких порций файла за один раз.Это неэффективно.
Решение, как и при любом другом типе операции извлечения памяти, состоит в том, чтобы извлекать большие блоки в заданный момент времени, а затем работать с извлеченным блоком.Другими словами, вы должны выгрузить весь контент файла в оперативную память и затем обработать его.Для этого вы можете использовать поток строк.По сути, чтение всего файла в поток строк приведет к гораздо меньшему извлечению памяти с жесткого диска (теоретически, он просто перенесет весь файл за одну операцию).Затем stringstream можно использовать так же, как и любой другой входной поток.
В действительности, возможно, будет более разумно найти способ избежать необходимости выполнять какие-либо операции ввода-вывода файлов в течение любого критического илиПроцесс с интенсивным использованием процессора.Либо делайте это до или после, старайтесь не делать это в середине цикла.Например, если вы загружаете все данные в массив / вектор, а затем обрабатываете массив / вектор, то больше не имеет значения, сколько времени требуется для загрузки данных из файла, потому что вы делаете это перед началом любой срочной обработкиданных.
PS: Поскольку вы используете fscanf (), я предполагаю, что вы можете искать решение в стиле C вместо стандартных библиотек C ++, таких как fstream и stringstream.Извините, я не могу дать вам намека на то, что желание придерживаться функций C - это проблема, которую я преодолел давным-давно, и, надеюсь, вы уже сделали это или сделаете это в ближайшее время.