FileReadStream
считывает фрагмент байтов в предоставленный пользователем буфер для каждой внутренней итерации. Используя эту концепцию потока, ей не нужно считывать весь JSON-файл в память.
Размер буфера может повлиять на производительность, но не корректность.
«Оптимальный» размер буфера зависит от платформы и приложения.
Если размер слишком мал, он будет нести дополнительные накладные расходы из-за увеличения количества звонков fread()
.
Для этого буфера часто используется стек программы (как в вашем примере), поэтому он не может быть слишком большим, так как размер стека ограничен. Использование большого буфера в стеке может быть большой проблемой для некоторых встроенных систем или приложений, использующих множество потоков.
Всегда есть некоторые параметры, которые могут повлиять на производительность. Если вашему приложению действительно нужна оптимальная производительность, я думаю, что лучший способ - эксперименты. В противном случае, я думаю, что 4096 (размер страницы большинства платформ) или выше просто отлично.
Кстати, RapidJSON является открытым исходным кодом, и этот класс очень прост. Просто прочитайте это header file, вы узнаете, как используется буфер.
P.S. Использование vector<>
здесь не является хорошей практикой. Поскольку vector<>
нуждается в распределении кучи, и здесь требуется только фиксированный размер. Использование стека программ дешевле.
вектор всегда лучший выбор, он может быть установлен на размер данных легко и динамически –
вы можете уточнить? Вы имели в виду что-то вроде этого? 'std :: vector readBuffer;' –
user3339357
, так как вы используете char readBuffer [80000]; он будет переведен в вектор как вектор readbuffer; (нулевой размер, его можно изменить позже). –