mirror of
https://github.com/biojppm/rapidyaml.git
synced 2026-01-18 21:41:18 +01:00
Update benchmarks
This commit is contained in:
@@ -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}")
|
||||
|
||||
@@ -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());
|
||||
|
||||
243
bm/bm_parse.cpp
243
bm/bm_parse.cpp
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user