mirror of
https://github.com/biojppm/rapidyaml.git
synced 2026-01-18 13:31:19 +01:00
919 lines
27 KiB
C++
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);
|