| ns/op | op/s | MdAPE | benchmark
|--------------------:|--------------------:|--------:|:----------------------------------------------
| 3.03 | 329,748,861.72 | 3.2% | `(a + b) / 2`
| 3.01 | 332,744,047.95 | 4.1% | `a + ((b - a) / 2)`
| 3.01 | 331,690,526.09 | 2.3% | `A/2 + B/2 + (A & B & 1)`
| 3.13 | 318,986,706.11 | 2.3% | `std::midpoint()`
| ns/op | op/s | MdAPE | benchmark
|--------------------:|--------------------:|--------:|:----------------------------------------------
| 11.78 | 84,915,083.52 | 1.3% | `(a + b) / 2`
| 12.65 | 79,023,808.01 | 2.8% | `a + ((b - a) / 2)`
| 13.65 | 73,254,437.92 | 1.3% | `A/2 + B/2 + (A & B & 1)`
| 16.53 | 60,489,903.03 | 1.3% | `std::midpoint()`
| ns/op | op/s | MdAPE | benchmark
|--------------------:|--------------------:|--------:|:----------------------------------------------
| 3.75 | 266,499,572.59 | 1.4% | `(a + b) / 2`
| 3.79 | 264,132,761.92 | 1.6% | `a + ((b - a) / 2)`
| 3.76 | 265,842,928.56 | 1.7% | `std::midpoint()`
| ns/op | op/s | MdAPE | benchmark
|--------------------:|--------------------:|--------:|:----------------------------------------------
| 27.52 | 36,339,772.33 | 4.4% | `(a + b) / 2`
| 12.64 | 79,125,450.88 | 1.6% | `a + ((b - a) / 2)`
| 25.55 | 39,137,522.62 | 1.6% | `std::midpoint()`
#define ANKERL_NANOBENCH_IMPLEMENT
#include <switch.h>
#include <ext/martinus/nanobench.h>
#include <numeric>
int main(int argc, char *argv[]) {
const unsigned a = str_view32(argv[1]).as_uint32();
const unsigned b = str_view32(argv[1]).as_uint32();
size_t sum = 0;
ankerl::nanobench::Config().minEpochIterations(256'000 * 4).run("(a + b) / 2", [&sum, a, b] {
const auto v = (a + b) / 2;
sum += v;
ankerl::nanobench::doNotOptimizeAway(sum);
});
sum = 0;
ankerl::nanobench::Config().minEpochIterations(256'000 * 4).run("a + ((b - a) / 2)", [&sum, a, b] {
const auto v = a + ((b - a) / 2);
sum += v;
ankerl::nanobench::doNotOptimizeAway(sum);
});
sum = 0;
ankerl::nanobench::Config().minEpochIterations(256'000 * 4).run("A/2 + B/2 + (A & B & 1)", [&sum, a, b] {
const auto v = a/2 + b/2 + (a & b & 1);
sum += v;
ankerl::nanobench::doNotOptimizeAway(sum);
});
sum = 0;
ankerl::nanobench::Config().minEpochIterations(256'000 * 4).run("std::midpoint()", [&sum, a, b] {
const auto v = std::midpoint(a, b);
sum += v;
ankerl::nanobench::doNotOptimizeAway(sum);
});
return 0;
}