aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/bench_bitvec.cpp352
-rw-r--r--test/bench_hilbert.cpp113
-rw-r--r--test/bench_utils.hpp64
3 files changed, 0 insertions, 529 deletions
diff --git a/test/bench_bitvec.cpp b/test/bench_bitvec.cpp
deleted file mode 100644
index 6580af9..0000000
--- a/test/bench_bitvec.cpp
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- Copyright (C) 2018 David Robillard <d@drobilla.net>
-
- This program is free software: you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
- Foundation, either version 2 of the License, or (at your option) any later
- version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
-
- You should have received a copy of the GNU General Public License along with
- this program. If not, see <https://www.gnu.org/licenses/>.
-*/
-
-#include "bench_utils.hpp"
-#include "test_utils.hpp"
-
-#include "chilbert/BoundedBitVec.hpp" // IWYU pragma: keep
-#include "chilbert/DynamicBitVec.hpp" // IWYU pragma: keep
-#include "chilbert/SmallBitVec.hpp"
-#include "chilbert/StaticBitVec.hpp" // IWYU pragma: keep
-
-#include <array>
-#include <cstddef>
-#include <fstream>
-#include <string>
-#include <vector>
-
-template <class T, size_t N>
-struct BenchAnd
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = make_random_bitvec<T, N>(ctx);
-
- return run_bench([&](auto) { r &= v; });
- }
-};
-
-template <class T, size_t N>
-struct BenchOr
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = make_random_bitvec<T, N>(ctx);
-
- return run_bench([&](auto) { r |= v; });
- }
-};
-
-template <class T, size_t N>
-struct BenchXor
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = make_random_bitvec<T, N>(ctx);
-
- return run_bench([&](auto) { r ^= v; });
- }
-};
-
-template <class T, size_t N>
-struct BenchSetOne
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](const auto i) { v.set(i % N); });
- }
-};
-
-template <class T, size_t N>
-struct BenchSetAll
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](auto) { v.set(); });
- }
-};
-
-template <class T, size_t N>
-struct BenchResetOne
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](const auto i) { v.reset(i % N); });
- }
-};
-
-template <class T, size_t N>
-struct BenchResetAll
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](auto) { v.reset(); });
- }
-};
-
-template <class T, size_t N>
-struct BenchFlipOne
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](const auto i) { v.flip(i % N); });
- }
-};
-
-template <class T, size_t N>
-struct BenchFlipAll
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](auto) { v.flip(); });
- }
-};
-
-template <class T, size_t N>
-struct BenchNone
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- bool r = false;
- (void)r;
-
- return run_bench([&](auto) { r = v.none(); });
- }
-};
-
-template <class T, size_t N>
-struct BenchCount
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- volatile size_t r = 0;
- (void)r;
-
- return run_bench([&](auto) { r = v.count(); });
- }
-};
-
-template <class T, size_t N>
-struct BenchLeftShift
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = v;
- return run_bench([&](const auto i) { r <<= (i % N); });
- }
-};
-
-template <class T, size_t N>
-struct BenchRightShift
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = v;
- return run_bench([&](const auto i) { r >>= (i % N); });
- }
-};
-
-template <class T, size_t N>
-struct BenchLeftRotate
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- return run_bench([&](const auto i) { v.rotl(i % N); });
- }
-};
-
-template <class T, size_t N>
-struct BenchRightRotate
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- volatile bool r = false;
- (void)r;
-
- return run_bench([&](const auto i) {
- v.rotr(i % N);
- r = v.test(0);
- });
- }
-};
-
-template <class T, size_t N>
-struct BenchFindFirst
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- volatile size_t r = 0;
- (void)r;
-
- return run_bench([&](auto) { r = v.find_first(); });
- }
-};
-
-template <class T, size_t N>
-struct BenchGrayCode
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = v;
-
- return run_bench([&](auto) { chilbert::detail::gray_code(r); });
- }
-};
-
-template <class T, size_t N>
-struct BenchGrayCodeInv
-{
- Duration operator()(Context& ctx)
- {
- const T v = make_random_bitvec<T, N>(ctx);
- T r = v;
-
- return run_bench([&](auto) { chilbert::detail::gray_code_inv(r); });
- }
-};
-
-template <class T, size_t N>
-struct BenchComparison
-{
- Duration operator()(Context& ctx)
- {
- std::vector<T> vecs;
- for (size_t i = 0; i < 32; ++i) {
- vecs.emplace_back(make_random_bitvec<T, N>(ctx));
- }
-
- volatile bool r = false;
-
- return run_bench([&](const auto i) {
- r |= vecs[i % vecs.size()] < vecs[(i + 1) % vecs.size()];
- });
- }
-};
-
-template <class T, size_t N>
-struct BenchIteration
-{
- Duration operator()(Context& ctx)
- {
- T v = make_random_bitvec<T, N>(ctx);
- auto i = v.begin();
- volatile bool r = false;
- return run_bench([&](const auto) {
- r = (++i == v.end());
- if (r) {
- i = v.begin();
- }
- });
- }
-};
-
-/// Run benchmark for size N
-template <template <class U, size_t M> class Bench, size_t N>
-void
-bench_row(Context& ctx, std::ostream& os)
-{
- std::array<Duration, 4> results = {
- ((N <= chilbert::SmallBitVec::bits_per_rack)
- ? Bench<chilbert::SmallBitVec, N>{}(ctx)
- : Duration{}),
- Bench<chilbert::StaticBitVec<N>, N>{}(ctx),
- Bench<chilbert::BoundedBitVec<N>, N>{}(ctx),
- Bench<chilbert::DynamicBitVec, N>{}(ctx),
- };
-
- write_row(os, N, results);
-}
-
-/// Terminate recursion
-template <template <class U, size_t M> class Bench>
-void
-bench_rec(Context&, std::ostream&)
-{
-}
-
-/// Run benchmark for sizes N, Ns... (recursive helper)
-template <template <class U, size_t M> class Bench, size_t N, size_t... Ns>
-void
-bench_rec(Context& ctx, std::ostream& os)
-{
- bench_row<Bench, N>(ctx, os);
- bench_rec<Bench, Ns...>(ctx, os);
-}
-
-/// Run benchmark
-template <template <class U, size_t M> class Bench>
-void
-bench(Context& ctx, const std::string& name)
-{
- std::ofstream out("bitvec_" + name + ".txt");
- out << "n\tsmall\tstatic\tbounded\tdynamic\n";
- bench_rec<Bench, 16, 32, 64, 128, 256, 512>(ctx, out);
-}
-
-int
-main()
-{
- Context ctx;
-
- bench<BenchAnd>(ctx, "and");
- bench<BenchOr>(ctx, "or");
- bench<BenchXor>(ctx, "xor");
- bench<BenchNone>(ctx, "none");
-
- bench<BenchSetOne>(ctx, "set_one");
- bench<BenchSetAll>(ctx, "set_all");
-
- bench<BenchResetOne>(ctx, "reset_one");
- bench<BenchResetAll>(ctx, "reset_all");
-
- bench<BenchFlipOne>(ctx, "flip_one");
- bench<BenchFlipAll>(ctx, "flip_all");
-
- bench<BenchCount>(ctx, "count");
- bench<BenchFindFirst>(ctx, "find_first");
-
- bench<BenchLeftShift>(ctx, "left_shift");
- bench<BenchRightShift>(ctx, "right_shift");
-
- bench<BenchLeftRotate>(ctx, "left_rotate");
- bench<BenchRightRotate>(ctx, "right_rotate");
-
- bench<BenchGrayCode>(ctx, "gray_code");
- bench<BenchGrayCodeInv>(ctx, "gray_code_inv");
-
- bench<BenchComparison>(ctx, "comparison");
- bench<BenchIteration>(ctx, "iteration");
-
- return 0;
-}
diff --git a/test/bench_hilbert.cpp b/test/bench_hilbert.cpp
deleted file mode 100644
index 52c12dc..0000000
--- a/test/bench_hilbert.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- Copyright (C) 2018 David Robillard <d@drobilla.net>
-
- This program is free software: you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
- Foundation, either version 2 of the License, or (at your option) any later
- version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
-
- You should have received a copy of the GNU General Public License along with
- this program. If not, see <https://www.gnu.org/licenses/>.
-*/
-
-#include "bench_utils.hpp"
-#include "test_utils.hpp"
-
-#include "chilbert/BoundedBitVec.hpp" // IWYU pragma: keep
-#include "chilbert/DynamicBitVec.hpp" // IWYU pragma: keep
-#include "chilbert/SmallBitVec.hpp"
-#include "chilbert/StaticBitVec.hpp" // IWYU pragma: keep
-#include "chilbert/chilbert.hpp"
-
-#include <array>
-#include <cstddef>
-#include <fstream>
-#include <string>
-
-template <class H, size_t M, size_t D>
-struct BenchCoordsToIndex
-{
- Duration operator()(Context& ctx)
- {
- const auto p = make_random_point<M, D>(ctx);
- H ha = make_zero_bitvec<H, D * M>();
-
- return run_bench([&](auto) { chilbert::coords_to_index(p, M, D, ha); });
- }
-};
-
-template <class H, size_t M, size_t D>
-struct BenchIndexToCoords
-{
- Duration operator()(Context& ctx)
- {
- auto p = make_random_point<M, D>(ctx);
- const H ha = make_random_bitvec<H, D * M>(ctx);
-
- return run_bench([&](auto) { chilbert::index_to_coords(p, M, D, ha); });
- }
-};
-
-/// Run benchmark for size N
-template <template <class H, size_t M, size_t D> class Bench,
- size_t M,
- size_t D>
-void
-bench_row(Context& ctx, std::ostream& os)
-{
- std::array<Duration, 4> results = {
- ((M * D <= chilbert::SmallBitVec::bits_per_rack)
- ? Bench<chilbert::SmallBitVec, M, D>{}(ctx)
- : Duration{}),
- Bench<chilbert::StaticBitVec<M * D>, M, D>{}(ctx),
- Bench<chilbert::BoundedBitVec<M * D>, M, D>{}(ctx),
- Bench<chilbert::DynamicBitVec, M, D>{}(ctx),
- };
-
- write_row(os, D, results);
-}
-
-/// Terminate recursion
-template <template <class H, size_t M, size_t D> class Bench, size_t M>
-void
-bench_rec(Context&, std::ostream&)
-{
-}
-
-/// Run benchmark for sizes N, Ns... (recursive helper)
-template <template <class H, size_t M, size_t D> class Bench,
- size_t M,
- size_t D,
- size_t... Ds>
-void
-bench_rec(Context& ctx, std::ostream& os)
-{
- bench_row<Bench, M, D>(ctx, os);
- bench_rec<Bench, M, Ds...>(ctx, os);
-}
-
-/// Run benchmark
-template <template <class H, size_t M, size_t D> class Bench>
-void
-bench(Context& ctx, const std::string& name)
-{
- std::ofstream out("hilbert_" + name + ".txt");
- out << "d\tsmall\tstatic\tbounded\tdynamic\n";
- bench_rec<Bench, 8, 2, 4, 8, 16, 32, 64>(ctx, out);
-}
-
-int
-main()
-{
- Context ctx;
-
- bench<BenchCoordsToIndex>(ctx, "coords_to_index");
- bench<BenchIndexToCoords>(ctx, "index_to_coords");
-
- return 0;
-}
diff --git a/test/bench_utils.hpp b/test/bench_utils.hpp
deleted file mode 100644
index a3f7f81..0000000
--- a/test/bench_utils.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Copyright (C) 2018 David Robillard <d@drobilla.net>
-
- This program is free software: you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
- Foundation, either version 2 of the License, or (at your option) any later
- version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
-
- You should have received a copy of the GNU General Public License along with
- this program. If not, see <https://www.gnu.org/licenses/>.
-*/
-
-#ifndef BENCH_UTILS_HPP
-#define BENCH_UTILS_HPP
-
-#include "test_utils.hpp"
-
-#include <array>
-#include <chrono>
-#include <cstddef>
-#include <iostream>
-
-using Duration = std::chrono::duration<double, std::micro>;
-
-/// Write a TSV row to `os` with `n` as the first column followed by `results`
-template <class T, size_t M>
-void
-write_row(std::ostream& os, const size_t n, const std::array<T, M>& results)
-{
- os << n;
- for (const auto t : results) {
- if (t == Duration::zero()) {
- os << "\tNaN";
- } else {
- os << '\t' << t.count();
- }
- }
- os << std::endl;
-}
-
-/// Repeatedly run an operation and return the average time
-template <class Operation>
-Duration
-run_bench(const Operation& op)
-{
- static constexpr auto bench_duration = std::chrono::milliseconds{10};
-
- const auto t_start = std::chrono::steady_clock{}.now();
- auto t_now = t_start;
- size_t count = 0;
- for (; t_now < t_start + bench_duration; ++count) {
- op(count);
- t_now = std::chrono::steady_clock{}.now();
- }
-
- return (t_now - t_start) / count;
-}
-
-#endif