From c2a4a32c6d7f65f8073fdfdebbbc1f7cc64c18d2 Mon Sep 17 00:00:00 2001 From: stefiosif Date: Mon, 5 Dec 2022 23:45:10 +0200 Subject: [PATCH] Add benchmark --- benchmark/algorithm_bench.cc | 174 ++++++++++++++++++++ benchmark/decremental_reachability_bench.cc | 8 - benchmark/dynamic_reachability_bench.cc | 97 ----------- 3 files changed, 174 insertions(+), 105 deletions(-) create mode 100644 benchmark/algorithm_bench.cc delete mode 100644 benchmark/decremental_reachability_bench.cc delete mode 100644 benchmark/dynamic_reachability_bench.cc diff --git a/benchmark/algorithm_bench.cc b/benchmark/algorithm_bench.cc new file mode 100644 index 0000000..09b3a75 --- /dev/null +++ b/benchmark/algorithm_bench.cc @@ -0,0 +1,174 @@ +#include +#include + +#include "algorithm/king.h" +#include "algorithm/henzinger_king.h" + +#include +#include +#include +#include + +using namespace graph; + +TEST_CASE("Italiano and King inspired algorithms") { + std::ifstream fdag{ "resources/dag.txt" }; + int u; + int v; + Digraph G; + std::vector> graphVertices; + std::vector> graphVerticesReverse; + + while (fdag >> u >> v) { + G.insert(u, v); + graphVertices.push_back(std::make_pair(u, v)); + graphVerticesReverse.push_back(std::make_pair(v, u)); + } + + auto italiano = std::make_unique>(G); + italiano->init(); + + auto king = std::make_unique>(G); + king->init(); + + ankerl::nanobench::Rng rng; + rng.shuffle(graphVertices); + + std::vector> graphVerticesDeleteSubset(graphVertices.begin(), graphVertices.begin() + 25); + std::vector> graphVerticesQuerySubset(graphVerticesReverse.begin() + 50, graphVerticesReverse.begin() + 75); + + // Deleting Phase + + ankerl::nanobench::Bench() + .epochs(1) + .run("Italiano::remove", + [&italiano, graphVerticesDeleteSubset] { + italiano->remove(graphVerticesDeleteSubset); + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("King::remove", + [&king, graphVerticesDeleteSubset] { + king->remove(graphVerticesDeleteSubset); + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("Simple::remove(DAG)", + [&G, graphVerticesDeleteSubset] { + for (const auto& [w, z] : graphVerticesDeleteSubset) { + G.remove(w, z); + } + }); + + // Querying Phase + + ankerl::nanobench::Bench() + .epochs(1) + .run("Italiano::query", + [&italiano, graphVerticesQuerySubset] { + for (const auto& [w, z] : graphVerticesQuerySubset) { + ankerl::nanobench::doNotOptimizeAway(italiano->query(w, z)); + } + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("King::query", + [&king, graphVerticesQuerySubset] { + for (const auto& [w, z] : graphVerticesQuerySubset) { + ankerl::nanobench::doNotOptimizeAway(king->query(w, z)); + } + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("Simple::query(DAG)", + [&G, graphVerticesQuerySubset] { + for (const auto& [w, z] : graphVerticesQuerySubset) { + ankerl::nanobench::doNotOptimizeAway(G.contains(w, z)); + } + }); +} + +TEST_CASE("Frigioni and Henzinger/King inspired algorithms") { + std::ifstream fgeneral{ "resources/general.txt" }; + int u; + int v; + Digraph G; + std::vector> graphVertices; + std::vector> graphVerticesReverse; + + while (fgeneral >> u >> v) { + G.insert(u, v); + graphVertices.push_back(std::make_pair(u, v)); + graphVerticesReverse.push_back(std::make_pair(v, u)); + } + + auto frigioni = std::make_unique>(G); + frigioni->init(); + + auto henzingerKing = std::make_unique>(G); + henzingerKing->init(); + + ankerl::nanobench::Rng rng; + rng.shuffle(graphVertices); + + std::vector> graphVerticesDeleteSubset(graphVertices.begin(), graphVertices.begin() + 25); + std::vector> graphVerticesQuerySubset(graphVerticesReverse.begin() + 50, graphVerticesReverse.begin() + 75); + + // Deleting Phase + + ankerl::nanobench::Bench() + .epochs(1) + .run("Frigioni::remove", + [&frigioni, graphVerticesDeleteSubset] { + frigioni->remove(graphVerticesDeleteSubset); + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("HenzingerKing::remove", + [&henzingerKing, graphVerticesDeleteSubset] { + henzingerKing->remove(graphVerticesDeleteSubset); + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("Simple::remove(General)", + [&G, graphVerticesDeleteSubset] { + for (const auto& [w, z] : graphVerticesDeleteSubset) { + G.remove(w, z); + } + }); + + // Querying Phase + + ankerl::nanobench::Bench() + .epochs(1) + .run("Frigioni::query", + [&frigioni, graphVerticesQuerySubset] { + for (const auto& [w, z] : graphVerticesQuerySubset) { + ankerl::nanobench::doNotOptimizeAway(frigioni->query(w, z)); + } + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("HenzingerKing::query", + [&henzingerKing, graphVerticesQuerySubset] { + for (const auto& [w, z] : graphVerticesQuerySubset) { + ankerl::nanobench::doNotOptimizeAway(henzingerKing->query(w, z)); + } + }); + + ankerl::nanobench::Bench() + .epochs(1) + .run("Simple::query(General)", + [&G, graphVerticesQuerySubset] { + for (const auto& [w, z] : graphVerticesQuerySubset) { + ankerl::nanobench::doNotOptimizeAway(G.contains(w, z)); + } + }); +} diff --git a/benchmark/decremental_reachability_bench.cc b/benchmark/decremental_reachability_bench.cc deleted file mode 100644 index 3d272c2..0000000 --- a/benchmark/decremental_reachability_bench.cc +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - -using namespace graph; - -TEST_SUITE("Decremental Reachability Bench") { - -} \ No newline at end of file diff --git a/benchmark/dynamic_reachability_bench.cc b/benchmark/dynamic_reachability_bench.cc deleted file mode 100644 index 171b26a..0000000 --- a/benchmark/dynamic_reachability_bench.cc +++ /dev/null @@ -1,97 +0,0 @@ -#include -#include - -#include "algorithm/king.h" -#include "algorithm/henzinger_king.h" - -#include -#include -#include - -using namespace graph; - -TEST_SUITE("Dynamic Reachability Bench") { - ankerl::nanobench::Bench dynBench; - - TEST_CASE("King") { - std::ifstream fgeneral{ "resources/dag.txt" }; - std::vector> dagGraph; - int fu, fv; - - while (fgeneral >> fu >> fv) - dagGraph.push_back({ fu, fv }); - - graph::Digraph G; - for (const auto& [u, v] : dagGraph) - G.insert(u, v); - - algo::King* k = new algo::King(G); - k->init(); - - std::random_device rd; - std::mt19937 mt(rd()); - std::ranges::shuffle(dagGraph, mt); - std::vector> delEdges(dagGraph.begin(), - dagGraph.begin() + 20); - - dynBench.epochs(1).run("K::remove", [&] { - k->remove(delEdges); } - ); - - std::uniform_int_distribution<> dist(1, 200); - - dynBench.epochs(1).run("K::query", [&] { - for (int i = 0; i < 50; ++i) - k->query(dist(mt), dist(mt)); } - ); - - std::vector insEdges; - for (int i = 0; i < 50; ++i) - insEdges.push_back(dist(mt)); - - dynBench.epochs(1).run("K::insert", [&] { - k->insert(50, insEdges); } - ); - } - - TEST_CASE("HenzingerKing") { - std::ifstream fgeneral{ "resources/general.txt" }; - std::vector> generalGraph; - int fu, fv; - - while (fgeneral >> fu >> fv) - generalGraph.push_back({ fu, fv }); - - graph::Digraph G; - for (const auto& [u, v] : generalGraph) - G.insert(u, v); - - algo::HenzingerKing* hk = new algo::HenzingerKing(G); - hk->init(); - - std::random_device rd; - std::mt19937 mt(rd()); - std::ranges::shuffle(generalGraph, mt); - std::vector> delEdges(generalGraph.begin(), - generalGraph.begin() + 20); - - dynBench.epochs(1).run("HK::remove", [&] { - hk->remove(delEdges); } - ); - - std::uniform_int_distribution<> dist(1, 200); - - dynBench.epochs(1).run("HK::query", [&] { - for (int i = 0; i < 50; ++i) - hk->query(dist(mt), dist(mt)); } - ); - - std::vector insEdges; - for (int i = 0; i < 50; ++i) - insEdges.push_back(dist(mt)); - - dynBench.epochs(1).run("HK::insert", [&] { - hk->insert(50, insEdges); } - ); - } -} \ No newline at end of file