Skip to content

Instantly share code, notes, and snippets.

@markpapadakis
Last active October 18, 2019 21:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markpapadakis/25ef1521aa3148afbd423b48e366eb94 to your computer and use it in GitHub Desktop.
Save markpapadakis/25ef1521aa3148afbd423b48e366eb94 to your computer and use it in GitHub Desktop.

unsigned integers

-O3

|               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()`

-O0

|               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()`

floats

-O3

|               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()`

-O0

|               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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment