diff options
author | chai <chaifix@163.com> | 2021-12-01 13:34:22 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-12-01 13:34:22 +0800 |
commit | 09abf1b529b4226f585ecfbb20866715b901755b (patch) | |
tree | 16929f2a6bee3ad4667bdd006cfcc1e683ab7210 /Client/ThirdParty/fpm/benchmarks/arithmetic.cpp | |
parent | 84d961f754c905b37420f4d1b3fee8f4e523e58a (diff) |
+fpm
Diffstat (limited to 'Client/ThirdParty/fpm/benchmarks/arithmetic.cpp')
-rw-r--r-- | Client/ThirdParty/fpm/benchmarks/arithmetic.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp b/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp new file mode 100644 index 0000000..b2053cf --- /dev/null +++ b/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp @@ -0,0 +1,58 @@ +#include <benchmark/benchmark.h> +#include <fpm/fixed.hpp> +#include <cnl/fixed_point.h> + +#include <fixmath.h> + +#define BENCHMARK_TEMPLATE1_CAPTURE(func, test_case_name, a, ...) \ + BENCHMARK_PRIVATE_DECLARE(func) = \ + (::benchmark::internal::RegisterBenchmarkInternal( \ + new ::benchmark::internal::FunctionBenchmark( \ + #func "<" #a ">/" #test_case_name, \ + [](::benchmark::State& st) { func<a>(st, __VA_ARGS__); }))) + +// Constants for our arithmetic operands. +// Stored as volatile to force the compiler to read them and +// not optimize the entire expression into a constant. +static volatile int16_t s_x = 1543; +static volatile int16_t s_y = 2552; + +template <typename TValue> +static void arithmetic(benchmark::State& state, TValue (*func)(TValue, TValue)) +{ + for (auto _ : state) + { + TValue x{ static_cast<TValue>(static_cast<int16_t>(s_x)) }, y{ static_cast<TValue>(static_cast<int16_t>(s_y)) }; + benchmark::DoNotOptimize(func(x, y)); + } +} + +#define FUNC(TYPE, OP) \ + [](TYPE x, TYPE y) -> TYPE { return x OP y; } + +using CnlFixed16 = cnl::fixed_point<std::int32_t, -16>; + +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, float, FUNC(float, +)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, float, FUNC(float, -)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, float, FUNC(float, *)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, float, FUNC(float, /)); + +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, double, FUNC(double, +)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, double, FUNC(double, -)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, double, FUNC(double, *)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, double, FUNC(double, /)); + +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, +)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, -)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, *)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, /)); + +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, Fix16, FUNC(Fix16, +)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, Fix16, FUNC(Fix16, -)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, Fix16, FUNC(Fix16, *)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, Fix16, FUNC(Fix16, /)); + +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, CnlFixed16, FUNC(CnlFixed16, +)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, CnlFixed16, FUNC(CnlFixed16, -)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, CnlFixed16, FUNC(CnlFixed16, *)); +BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, CnlFixed16, FUNC(CnlFixed16, /)); |