Я пишу С++ 14 JSON library в качестве упражнения и использую его в своих личных проектах.
Используя callgrind, я обнаружил, что текущее узкое место при создании непрерывного значения из стримерного стресс-теста представляет собой распределение динамической памяти std::string
. Именно узким местом является вызов malloc(...)
из std::string::reserve
.
Я читал, что многие существующие библиотеки JSON, такие как rapidjson, используют пользовательские распределители, чтобы избежать вызовов malloc(...)
во время выделения строки памяти.
Я попытался проанализировать исходный код quickjson, но большой объем дополнительного кода и комментариев, а также тот факт, что я не совсем уверен, что я ищу, не очень помог мне.
- Как помогают пользовательские распределители в этой ситуации?
- Является ли буфер памяти предварительно размещенным где-нибудь (где? статически?) и
std::strings
извлечь из него доступную память?
- Является ли буфер памяти предварительно размещенным где-нибудь (где? статически?) и
- Являются ли строки с использованием пользовательских распределителей "совместимыми" с обычными строками?
- У них разные типы. Они должны быть "преобразованы"? (И это приводит к хиту производительности?)
Примечания к коду:
-
Str
является псевдонимом дляstd::string
.