2014-11-13 1 views
2

Итак, я использовал quickjson в проекте C++, и я выяснил, как использовать его для моих проектов. Но, читая мой код, я увидел, что я просто назначил случайное число для моего размера буфера.Установка правильного размера для quickjson readBuffer

char readBuffer[80000]; rapidjson::FileReadStream readStream(file, readBuffer, sizeof(readBuffer));

Есть правильный способ, чтобы установить, насколько большой ReadBuffer должен быть?

+0

вектор всегда лучший выбор, он может быть установлен на размер данных легко и динамически –

+0

вы можете уточнить? Вы имели в виду что-то вроде этого? 'std :: vector readBuffer;' – user3339357

+0

, так как вы используете char readBuffer [80000]; он будет переведен в вектор как вектор readbuffer; (нулевой размер, его можно изменить позже). –

ответ

0

FileReadStream считывает фрагмент байтов в предоставленный пользователем буфер для каждой внутренней итерации. Используя эту концепцию потока, ей не нужно считывать весь JSON-файл в память.

Размер буфера может повлиять на производительность, но не корректность.

«Оптимальный» размер буфера зависит от платформы и приложения.

Если размер слишком мал, он будет нести дополнительные накладные расходы из-за увеличения количества звонков fread().

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

Всегда есть некоторые параметры, которые могут повлиять на производительность. Если вашему приложению действительно нужна оптимальная производительность, я думаю, что лучший способ - эксперименты. В противном случае, я думаю, что 4096 (размер страницы большинства платформ) или выше просто отлично.

Кстати, RapidJSON является открытым исходным кодом, и этот класс очень прост. Просто прочитайте это header file, вы узнаете, как используется буфер.

P.S. Использование vector<> здесь не является хорошей практикой. Поскольку vector<> нуждается в распределении кучи, и здесь требуется только фиксированный размер. Использование стека программ дешевле.

+0

Итак, я принял ваш совет и сделал размер буфера = 4096. Вообще говоря, я использую его в основном для чтения файлов настроек, которые в любом случае не будут слишком большими. благодаря! – user3339357