Update benchmarks

This commit is contained in:
Joao Paulo Magalhaes
2025-09-28 19:08:55 +01:00
parent 0fcfa3ef21
commit 9049b133f8
3 changed files with 327 additions and 3 deletions

View File

@@ -119,8 +119,13 @@ set(RYML_SAJSON_INC_DIR ${sajson_dir}/include)
function(ryml_add_bm_comparison_exe name)
c4_add_executable(ryml-bm-${name}
SOURCES bm_common.hpp ${ARGN}
../src_extra/c4/yml/extra/event_handler_ints.hpp
../src_extra/c4/yml/extra/event_handler_ints.cpp
LIBS ryml yaml yaml-cpp benchmark jsoncpp_static nlohmann_json c4fs
INC_DIRS ${RYML_RAPIDJSON_INC_DIR} ${RYML_SAJSON_INC_DIR}
INC_DIRS
${RYML_RAPIDJSON_INC_DIR}
${RYML_SAJSON_INC_DIR}
../src_extra
FOLDER bm)
if(RYML_DBG)
target_compile_definitions(ryml-bm-${name} PRIVATE RYML_DBG)
@@ -133,9 +138,8 @@ function(ryml_add_bm_comparison_exe name)
_c4_set_target_folder(ryml-bm-${name}-all bm/run)
endfunction()
ryml_add_bm_comparison_exe(parse bm_parse.cpp)
ryml_add_bm_comparison_exe(emit bm_emit.cpp)
ryml_add_bm_comparison_exe(parse bm_parse.cpp)
function(ryml_add_bm_comparison_case target name case_file)
c4_dbg("adding benchmark case: ${case_file}")

View File

@@ -4,6 +4,7 @@
#include <ryml_std.hpp>
#include <c4/fs/fs.hpp>
#include "c4/yml/parse.hpp"
#include "c4/yml/extra/event_handler_ints.hpp"
#include <vector>
#include <iostream>
@@ -82,14 +83,81 @@ namespace bm = benchmark;
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
# pragma clang diagnostic ignored "-Wunused-variable"
# pragma clang diagnostic ignored "-Wsign-conversion"
# pragma clang diagnostic ignored "-Wold-style-cast"
#elif defined(__GNUC__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
# pragma GCC diagnostic ignored "-Wunused-variable"
# pragma GCC diagnostic ignored "-Wsign-conversion"
# pragma GCC diagnostic ignored "-Wold-style-cast"
#endif
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
using IntHandler = ryml::extra::EventHandlerInts;
using IntParser = ryml::ParseEngine<IntHandler>;
struct IntData
{
std::vector<int> events;
std::vector<char> arena;
void resize(ryml::extra::EventHandlerInts const& handler)
{
resize((size_t)handler.required_size_events(),
handler.required_size_arena());
}
void resize(ryml::substr src)
{
resize((size_t)ryml::extra::estimate_events_ints_size(src),
src.len);
}
void resize(size_t evt_sz, size_t arn_sz)
{
events.resize(evt_sz);
events.resize(arn_sz);
}
};
struct IntObjects
{
IntObjects(ryml::ParserOptions opts={})
: handler()
, parser(&handler, opts)
, data()
{
}
IntHandler handler;
IntParser parser;
IntData data;
bool again()
{
if(!handler.fits_buffers())
{
data.resize(handler);
return true;
}
return false;
}
};
inline void parse_yaml_inplace(ryml::csubstr filename, ryml::substr src, IntParser &parser, IntData *dst)
{
parser.m_evt_handler->reset(src,
ryml::to_substr(dst->arena),
dst->events.data(),
(int)dst->events.size());
parser.parse_in_place_ev(filename, src);
}
inline void parse_json_inplace(ryml::csubstr filename, ryml::substr src, IntParser &parser, IntData *dst)
{
parser.m_evt_handler->reset(src,
ryml::to_substr(dst->arena),
dst->events.data(),
(int)dst->events.size());
parser.parse_json_in_place_ev(filename, src);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
@@ -99,6 +167,7 @@ enum : int {
kClearTreeArena=2,
kResetInPlace=4,
kReserveTree=8,
kReserveInts=8,
kAll=kClearTree|kClearTreeArena|kResetInPlace|kReserveTree,
};
@@ -117,6 +186,9 @@ struct BmCase
rapidjson::Document rapidjson_doc;
ryml::Tree libyaml_tree;
IntObjects int_obj;
IntObjects int_obj_nofilter{ryml::ParserOptions().scalar_filtering(false)};
void run(std::string name, int argc, char **argv)
{
bm_name = name;
@@ -173,6 +245,11 @@ USAGE: bm <case.yml>
RYML_CHECK(capacity > 0);
ryml_tree.reserve(capacity);
}
if(what & kReserveTree)
{
RYML_CHECK(capacity > 0);
ryml_tree.reserve(capacity);
}
if(what & kResetInPlace)
{
C4_ASSERT(in_place.size() == src.size());

View File

@@ -279,6 +279,168 @@ void bm_ryml_json_arena_nofilter_reserve(bm::State& 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)
@@ -513,6 +675,66 @@ void bm_ryml_json_arena_reuse_nofilter_reserve(bm::State& 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)
@@ -617,6 +839,16 @@ void bm_ryml_json_inplace_reuse_nofilter_reserve(bm::State& 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);
@@ -639,6 +871,17 @@ 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);