Measure per byte in benchmarks and remove some of them

This commit is contained in:
2025-08-17 14:40:57 -04:00
parent 05ee8e05f8
commit 032a4184cc
2 changed files with 20 additions and 201 deletions

View File

@@ -463,7 +463,8 @@ int main() {
// Simple JSON comparison
auto simple_bench = ankerl::nanobench::Bench()
.title("Simple JSON Parsing Comparison")
.unit("parse")
.unit("byte")
.batch(SIMPLE_JSON.size())
.warmup(100)
.minEpochIterations(1000);
@@ -542,7 +543,8 @@ int main() {
// Medium complexity JSON comparison
auto medium_bench = ankerl::nanobench::Bench()
.title("Medium JSON Parsing Comparison")
.unit("parse")
.unit("byte")
.batch(MEDIUM_JSON.size())
.warmup(100)
.minEpochIterations(500);
@@ -621,7 +623,8 @@ int main() {
// Complex JSON comparison
auto complex_bench = ankerl::nanobench::Bench()
.title("Complex JSON Parsing Comparison")
.unit("parse")
.unit("byte")
.batch(COMPLEX_JSON.size())
.warmup(100)
.minEpochIterations(200);
@@ -697,16 +700,16 @@ int main() {
ankerl::nanobench::doNotOptimizeAway(handler.operations.size());
});
// Large batch operations comparison
auto large_bench = ankerl::nanobench::Bench()
.title("Large JSON Parsing Comparison")
.unit("parse")
.warmup(50)
.minEpochIterations(100);
for (int num_ops : {50, 100, 500}) {
std::string large_json = generate_large_json(num_ops);
std::string bench_name = std::to_string(num_ops) + " operations";
// Large batch operations comparison
auto large_bench = ankerl::nanobench::Bench()
.title("Large JSON Parsing Comparison")
.unit("byte")
.batch(large_json.size())
.warmup(50)
.minEpochIterations(100);
large_bench.run("WeaselDB Parser (" + bench_name + ")", [&] {
CommitRequest request;
@@ -783,133 +786,6 @@ int main() {
});
}
// Memory efficiency comparison
auto memory_bench = ankerl::nanobench::Bench()
.title("Memory Efficiency Comparison")
.unit("allocation")
.warmup(50)
.minEpochIterations(200);
memory_bench.run("WeaselDB Parser (arena allocation)", [&] {
CommitRequest request;
JsonCommitRequestParser parser;
std::string mutable_json = COMPLEX_JSON;
bool result =
parser.parse(request, mutable_json.data(), mutable_json.size());
ankerl::nanobench::doNotOptimizeAway(result);
ankerl::nanobench::doNotOptimizeAway(request.total_allocated());
ankerl::nanobench::doNotOptimizeAway(request.used_bytes());
});
memory_bench.run("nlohmann/json (standard allocation)", [&] {
try {
nlohmann::json j = nlohmann::json::parse(COMPLEX_JSON);
bool result = validate_nlohmann_commit_request(j);
ankerl::nanobench::doNotOptimizeAway(result);
ankerl::nanobench::doNotOptimizeAway(j.size());
} catch (const std::exception &) {
ankerl::nanobench::doNotOptimizeAway(false);
}
});
memory_bench.run("RapidJSON SAX (standard allocation)", [&] {
CommitRequestSaxHandler handler;
rapidjson::Reader reader;
rapidjson::StringStream ss(COMPLEX_JSON.c_str());
bool result = reader.Parse(ss, handler);
result = result && handler.validate();
ankerl::nanobench::doNotOptimizeAway(result);
ankerl::nanobench::doNotOptimizeAway(handler.preconditions.size());
ankerl::nanobench::doNotOptimizeAway(handler.operations.size());
});
memory_bench.run("RapidJSON SAX Arena (arena allocation)", [&] {
CommitRequestArenaHandler handler;
rapidjson::Reader reader;
rapidjson::StringStream ss(COMPLEX_JSON.c_str());
bool result = reader.Parse(ss, handler);
result = result && handler.validate();
ankerl::nanobench::doNotOptimizeAway(result);
ankerl::nanobench::doNotOptimizeAway(handler.total_allocated());
ankerl::nanobench::doNotOptimizeAway(handler.used_bytes());
});
// Reset and reuse comparison
auto reuse_bench = ankerl::nanobench::Bench()
.title("Reset and Reuse Comparison")
.unit("cycle")
.warmup(50)
.minEpochIterations(100);
reuse_bench.run("WeaselDB Parser (reset)", [&] {
static CommitRequest request;
static JsonCommitRequestParser parser;
std::string mutable_json1 = SIMPLE_JSON;
bool result1 =
parser.parse(request, mutable_json1.data(), mutable_json1.size());
request.reset();
std::string mutable_json2 = MEDIUM_JSON;
bool result2 =
parser.parse(request, mutable_json2.data(), mutable_json2.size());
ankerl::nanobench::doNotOptimizeAway(result1);
ankerl::nanobench::doNotOptimizeAway(result2);
});
reuse_bench.run("nlohmann/json (new instance)", [&] {
try {
nlohmann::json j1 = nlohmann::json::parse(SIMPLE_JSON);
bool result1 = validate_nlohmann_commit_request(j1);
nlohmann::json j2 = nlohmann::json::parse(MEDIUM_JSON);
bool result2 = validate_nlohmann_commit_request(j2);
ankerl::nanobench::doNotOptimizeAway(result1);
ankerl::nanobench::doNotOptimizeAway(result2);
} catch (const std::exception &) {
ankerl::nanobench::doNotOptimizeAway(false);
}
});
reuse_bench.run("RapidJSON SAX (reset)", [&] {
static CommitRequestSaxHandler handler;
rapidjson::Reader reader;
rapidjson::StringStream ss1(SIMPLE_JSON.c_str());
bool result1 = reader.Parse(ss1, handler);
result1 = result1 && handler.validate();
handler.reset();
rapidjson::StringStream ss2(MEDIUM_JSON.c_str());
bool result2 = reader.Parse(ss2, handler);
result2 = result2 && handler.validate();
ankerl::nanobench::doNotOptimizeAway(result1);
ankerl::nanobench::doNotOptimizeAway(result2);
});
reuse_bench.run("RapidJSON SAX Arena (reset)", [&] {
static CommitRequestArenaHandler handler;
rapidjson::Reader reader;
rapidjson::StringStream ss1(SIMPLE_JSON.c_str());
bool result1 = reader.Parse(ss1, handler);
result1 = result1 && handler.validate();
handler.reset();
rapidjson::StringStream ss2(MEDIUM_JSON.c_str());
bool result2 = reader.Parse(ss2, handler);
result2 = result2 && handler.validate();
ankerl::nanobench::doNotOptimizeAway(result1);
ankerl::nanobench::doNotOptimizeAway(result2);
});
std::cout << "\nBenchmark completed. The WeaselDB parser is optimized for:\n";
std::cout << "- Arena-based memory allocation for reduced fragmentation\n";
std::cout << "- Streaming parsing for network protocols\n";