Files
rapidyaml/bm/bm_parse.cpp
Joao Paulo Magalhaes 9049b133f8 Update benchmarks
2025-09-29 00:01:36 +01:00

919 lines
27 KiB
C++

#include "./bm_common.hpp"
/** this is used by the benchmarks.
*
* @note We cannot declare the case as value-static as there is no guarantee
* that the allocator's lifetime starts before and ends after the case's
* lifetime. So use a pointer to control the lifetime. */
static BmCase * C4_RESTRICT s_bm_case = nullptr;
int main(int argc, char** argv)
{
BmCase fixture;
s_bm_case = &fixture;
s_bm_case->run("PARSE", argc, argv);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#define ONLY_FOR_JSON \
if(!s_bm_case->is_json) { st.SkipWithError("not a json file"); return; }
ryml::id_type estimate_capacity(ryml::csubstr src)
{
return (3 * ryml::estimate_tree_capacity(src)) >> 1;
}
void bm_rapidjson_arena(bm::State& st)
{
const char *src = s_bm_case->src.data();
for(auto _ : st)
{
ONLY_FOR_JSON;
rapidjson::Document doc;
doc.Parse(src);
}
s_bm_case->report(st);
}
void bm_rapidjson_inplace(bm::State& st)
{
char *src = s_bm_case->in_place.data();
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace);
rapidjson::Document doc;
doc.ParseInsitu(src);
}
s_bm_case->report(st);
}
void bm_sajson_arena(bm::State& st)
{
sajson::string src = {s_bm_case->src.data(), s_bm_case->src.size()};
for(auto _ : st)
{
ONLY_FOR_JSON;
sajson::document document = sajson::parse(sajson::dynamic_allocation(), src);
}
s_bm_case->report(st);
}
void bm_sajson_inplace(bm::State& st)
{
sajson::mutable_string_view src = {s_bm_case->in_place.size(), s_bm_case->in_place.data()};
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace);
sajson::document document = sajson::parse(sajson::dynamic_allocation(), src);
}
s_bm_case->report(st);
}
void bm_jsoncpp_arena(bm::State& st)
{
const char *b = &s_bm_case->src.front(), *e = &s_bm_case->src.back();
for(auto _ : st)
{
ONLY_FOR_JSON;
Json::Value root;
Json::Reader reader;
reader.parse(b, e, root);
}
s_bm_case->report(st);
}
void bm_nlohmann_arena(bm::State& st)
{
const char* src = s_bm_case->src.data();
for(auto _ : st)
{
ONLY_FOR_JSON;
auto root = nlohmann::json::parse(src);
}
s_bm_case->report(st);
}
void bm_yamlcpp_arena(bm::State& st)
{
const char* src = s_bm_case->src.data();
for(auto _ : st)
{
YAML::Node node = YAML::Load(src);
}
s_bm_case->report(st);
}
void bm_libyaml_arena(bm::State& st)
{
if(s_bm_case->skip_libyaml_if_needed(st))
return;
c4::csubstr src = c4::to_csubstr(s_bm_case->src.data());
for(auto _ : st)
{
c4::yml::LibyamlParser p;
c4::yml::Tree t;
p.parse(&t, src);
}
s_bm_case->report(st);
}
void bm_libyaml_arena_reuse(bm::State& st)
{
if(s_bm_case->skip_libyaml_if_needed(st))
return;
c4::csubstr src = c4::to_csubstr(s_bm_case->src.data());
for(auto _ : st)
{
c4::yml::LibyamlParser libyaml_parser;
s_bm_case->prepare(st, kClearTree|kClearTreeArena);
libyaml_parser.parse(&s_bm_case->libyaml_tree, src);
}
s_bm_case->report(st);
}
#ifdef RYML_HAVE_LIBFYAML
void bm_libfyaml_arena(bm::State& st)
{
if(s_bm_case->skip_libfyaml_if_needed(st))
return;
c4::csubstr src = c4::to_csubstr(s_bm_case->src.data());
for(auto _ : st)
{
struct fy_document *fyd = fy_document_build_from_string(nullptr, src.str, src.len);
fy_document_destroy(fyd);
}
s_bm_case->report(st);
}
#endif
//-----------------------------------------------------------------------------
void bm_ryml_yaml_arena(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
ryml::Tree tree = ryml::parse_in_arena(s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_arena_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
st.PauseTiming();
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_in_arena(s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_arena_nofilter(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
st.PauseTiming();
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
st.ResumeTiming();
ryml::Tree tree = ryml::parse_in_arena(&parser, s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_arena_nofilter_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
st.PauseTiming();
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_in_arena(&parser, s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_json_arena(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
ryml::Tree tree = ryml::parse_json_in_arena(s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_json_arena_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_json_in_arena(s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_arena_nofilter(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
st.ResumeTiming();
ryml::Tree tree = ryml::parse_json_in_arena(&parser, s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_json_arena_nofilter_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_json_in_arena(&parser, s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_rymlints_estimate(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
auto sz = c4::yml::extra::estimate_events_ints_size(src);
bm::DoNotOptimize(sz);
}
s_bm_case->report(st);
}
void bm_rymlints_yaml_inplace(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
IntObjects obj;
s_bm_case->prepare(st, kResetInPlace);
parse_yaml_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
if(obj.again())
{
s_bm_case->prepare(st, kResetInPlace);
parse_yaml_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
}
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
void bm_rymlints_yaml_inplace_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
int sz = ryml::extra::estimate_events_ints_size(src);
for(auto _ : st)
{
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
IntObjects obj;
obj.data.resize(src);
st.ResumeTiming();
parse_yaml_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
void bm_rymlints_yaml_inplace_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
IntObjects obj(ryml::ParserOptions().scalar_filtering(false));
s_bm_case->prepare(st, kResetInPlace);
parse_yaml_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
if(obj.again())
{
s_bm_case->prepare(st, kResetInPlace);
parse_yaml_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
}
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
void bm_rymlints_yaml_inplace_nofilter_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
int sz = ryml::extra::estimate_events_ints_size(src);
for(auto _ : st)
{
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
IntObjects obj(ryml::ParserOptions().scalar_filtering(false));
obj.data.resize(src);
st.ResumeTiming();
parse_yaml_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_rymlints_json_inplace(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
IntObjects obj;
s_bm_case->prepare(st, kResetInPlace);
parse_json_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
if(obj.again())
{
s_bm_case->prepare(st, kResetInPlace);
parse_json_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
}
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
void bm_rymlints_json_inplace_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
int sz = ryml::extra::estimate_events_ints_size(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
IntObjects obj;
obj.data.resize(src);
st.ResumeTiming();
parse_json_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
void bm_rymlints_json_inplace_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
IntObjects obj(ryml::ParserOptions().scalar_filtering(false));
s_bm_case->prepare(st, kResetInPlace);
parse_json_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
if(obj.again())
{
s_bm_case->prepare(st, kResetInPlace);
parse_json_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
}
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
void bm_rymlints_json_inplace_nofilter_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
int sz = ryml::extra::estimate_events_ints_size(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
IntObjects obj(ryml::ParserOptions().scalar_filtering(false));
obj.data.resize(src);
st.ResumeTiming();
parse_json_inplace(s_bm_case->filename, src, obj.parser, &obj.data);
bm::DoNotOptimize(obj);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_yaml_inplace(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace);
ryml::Tree tree = ryml::parse_in_place(s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_inplace_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_in_place(s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_inplace_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
st.ResumeTiming();
ryml::Tree tree = ryml::parse_in_place(&parser, s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_inplace_nofilter_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_in_place(&parser, s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_json_inplace(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
st.ResumeTiming();
ryml::Tree tree = ryml::parse_json_in_place(s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_json_inplace_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_json_in_place(s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_inplace_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
st.ResumeTiming();
ryml::Tree tree = ryml::parse_json_in_place(&parser, s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_json_inplace_nofilter_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
st.PauseTiming();
s_bm_case->prepare(kResetInPlace);
ryml::EventHandlerTree evth;
ryml::Parser parser(&evth, ryml::ParserOptions().scalar_filtering(false));
ryml::Tree tree;
tree.reserve(cap);
st.ResumeTiming();
ryml::parse_json_in_place(&parser, s_bm_case->filename, src, &tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_yaml_arena_reuse(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
s_bm_case->prepare(st, kClearTree|kClearTreeArena);
parse_in_arena(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_arena_reuse_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
s_bm_case->prepare(st, kClearTree|kClearTreeArena|kReserveTree, cap);
parse_in_arena(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_arena_reuse_nofilter(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
s_bm_case->prepare(st, kClearTree|kClearTreeArena);
parse_in_arena(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_arena_reuse_nofilter_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
s_bm_case->prepare(st, kClearTree|kClearTreeArena|kReserveTree, cap);
parse_in_arena(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_json_arena_reuse(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kClearTree|kClearTreeArena);
parse_json_in_arena(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_arena_reuse_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kClearTree|kClearTreeArena|kReserveTree, cap);
parse_json_in_arena(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_arena_reuse_nofilter(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kClearTree|kClearTreeArena);
parse_json_in_arena(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_arena_reuse_nofilter_reserve(bm::State& st)
{
c4::csubstr src = c4::to_csubstr(s_bm_case->src).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kClearTree|kClearTreeArena|kReserveTree, cap);
parse_json_in_arena(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_rymlints_yaml_inplace_reuse(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
s_bm_case->int_obj.data.resize(src);
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace);
parse_yaml_inplace(s_bm_case->filename, src, s_bm_case->int_obj.parser, &s_bm_case->int_obj.data);
bm::DoNotOptimize(s_bm_case->int_obj);
}
s_bm_case->report(st);
}
void bm_rymlints_yaml_inplace_reuse_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
s_bm_case->int_obj_nofilter.data.resize(src);
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace);
parse_yaml_inplace(s_bm_case->filename, src, s_bm_case->int_obj_nofilter.parser, &s_bm_case->int_obj_nofilter.data);
bm::DoNotOptimize(s_bm_case->int_obj_nofilter);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_rymlints_json_inplace_reuse(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
s_bm_case->int_obj.data.resize(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace);
parse_json_inplace(s_bm_case->filename, src, s_bm_case->int_obj.parser, &s_bm_case->int_obj.data);
bm::DoNotOptimize(s_bm_case->int_obj);
}
s_bm_case->report(st);
}
void bm_rymlints_json_inplace_reuse_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
s_bm_case->int_obj_nofilter.data.resize(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace);
parse_json_inplace(s_bm_case->filename, src, s_bm_case->int_obj_nofilter.parser, &s_bm_case->int_obj_nofilter.data);
bm::DoNotOptimize(s_bm_case->int_obj_nofilter);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_yaml_inplace_reuse(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena);
parse_in_place(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_inplace_reuse_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena|kReserveTree, cap);
parse_in_place(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_inplace_reuse_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena);
parse_in_place(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_yaml_inplace_reuse_nofilter_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena|kReserveTree, cap);
parse_in_place(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
void bm_ryml_json_inplace_reuse(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena);
parse_json_in_place(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_inplace_reuse_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena|kReserveTree, cap);
parse_json_in_place(&s_bm_case->ryml_parser, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_inplace_reuse_nofilter(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena);
parse_json_in_place(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
void bm_ryml_json_inplace_reuse_nofilter_reserve(bm::State& st)
{
c4::substr src = c4::to_substr(s_bm_case->in_place).trimr('\0');
ryml::id_type cap = estimate_capacity(src);
for(auto _ : st)
{
ONLY_FOR_JSON;
s_bm_case->prepare(st, kResetInPlace|kClearTree|kClearTreeArena|kReserveTree, cap);
parse_json_in_place(&s_bm_case->ryml_parser_nofilter, s_bm_case->filename, src, &s_bm_case->ryml_tree);
}
s_bm_case->report(st);
}
//-----------------------------------------------------------------------------
BENCHMARK(bm_rymlints_estimate);
BENCHMARK(bm_rymlints_json_inplace_reuse_nofilter);
BENCHMARK(bm_rymlints_json_inplace_reuse);
BENCHMARK(bm_rymlints_yaml_inplace_reuse_nofilter);
BENCHMARK(bm_rymlints_yaml_inplace_reuse);
BENCHMARK(bm_ryml_json_inplace_reuse_nofilter_reserve);
BENCHMARK(bm_ryml_json_inplace_reuse_nofilter);
BENCHMARK(bm_ryml_json_inplace_reuse_reserve);
BENCHMARK(bm_ryml_json_inplace_reuse);
BENCHMARK(bm_ryml_yaml_inplace_reuse_nofilter_reserve);
BENCHMARK(bm_ryml_yaml_inplace_reuse_nofilter);
BENCHMARK(bm_ryml_yaml_inplace_reuse_reserve);
BENCHMARK(bm_ryml_yaml_inplace_reuse);
BENCHMARK(bm_ryml_json_arena_reuse_nofilter_reserve);
BENCHMARK(bm_ryml_json_arena_reuse_nofilter);
BENCHMARK(bm_ryml_json_arena_reuse_reserve);
BENCHMARK(bm_ryml_json_arena_reuse);
BENCHMARK(bm_ryml_yaml_arena_reuse_nofilter_reserve);
BENCHMARK(bm_ryml_yaml_arena_reuse_nofilter);
BENCHMARK(bm_ryml_yaml_arena_reuse_reserve);
BENCHMARK(bm_ryml_yaml_arena_reuse);
BENCHMARK(bm_rymlints_json_inplace_nofilter_reserve);
BENCHMARK(bm_rymlints_json_inplace_nofilter);
BENCHMARK(bm_rymlints_json_inplace_reserve);
BENCHMARK(bm_rymlints_json_inplace);
BENCHMARK(bm_rymlints_yaml_inplace_nofilter_reserve);
BENCHMARK(bm_rymlints_yaml_inplace_nofilter);
BENCHMARK(bm_rymlints_yaml_inplace_reserve);
BENCHMARK(bm_rymlints_yaml_inplace);
BENCHMARK(bm_ryml_json_inplace_nofilter_reserve);
BENCHMARK(bm_ryml_json_inplace_nofilter);
BENCHMARK(bm_ryml_json_inplace_reserve);
BENCHMARK(bm_ryml_json_inplace);
BENCHMARK(bm_ryml_yaml_inplace_nofilter_reserve);
BENCHMARK(bm_ryml_yaml_inplace_nofilter);
BENCHMARK(bm_ryml_yaml_inplace_reserve);
BENCHMARK(bm_ryml_yaml_inplace);
BENCHMARK(bm_ryml_json_arena_nofilter_reserve);
BENCHMARK(bm_ryml_json_arena_nofilter);
BENCHMARK(bm_ryml_json_arena_reserve);
BENCHMARK(bm_ryml_json_arena);
BENCHMARK(bm_ryml_yaml_arena_nofilter_reserve);
BENCHMARK(bm_ryml_yaml_arena_nofilter);
BENCHMARK(bm_ryml_yaml_arena_reserve);
BENCHMARK(bm_ryml_yaml_arena);
BENCHMARK(bm_libyaml_arena);
BENCHMARK(bm_libyaml_arena_reuse);
#ifdef RYML_HAVE_LIBFYAML
BENCHMARK(bm_libfyaml_arena);
#endif
BENCHMARK(bm_yamlcpp_arena);
BENCHMARK(bm_rapidjson_arena);
BENCHMARK(bm_rapidjson_inplace);
BENCHMARK(bm_sajson_arena);
BENCHMARK(bm_sajson_inplace);
BENCHMARK(bm_jsoncpp_arena);
BENCHMARK(bm_nlohmann_arena);