1 #include <benchmark/benchmark.h>
2 #include "game_variables.h"
3 #include <lcf/data.h>
4
5 constexpr int max_vars = 1024; // Keep this a power of 2 so no expensive modulus instructions
6
make(int size=max_vars)7 static Game_Variables make(int size = max_vars) {
8 lcf::Data::variables.resize(size);
9 Game_Variables variables(Game_Variables::min_2k3, Game_Variables::max_2k3);
10 variables.SetRange(1, size, 1);
11 return variables;
12 }
13
14 template <typename F>
BM_VariableOp(benchmark::State & state,F && op)15 static void BM_VariableOp(benchmark::State& state, F&& op) {
16 auto v = make();
17 int i = 0;
18 for (auto _: state) {
19 op(v, i + 1, i + 1);
20 i = (i + 1) % max_vars;
21 }
22 }
23
BM_VariableGet(benchmark::State & state)24 static void BM_VariableGet(benchmark::State& state) {
25 volatile int x = 0;
26 BM_VariableOp(state, [&x](auto& v, auto id, auto) { x = v.Get(id); });
27 }
28
29 BENCHMARK(BM_VariableGet);
30
BM_VariableSet(benchmark::State & state)31 static void BM_VariableSet(benchmark::State& state) {
32 volatile int x = 0;
33 BM_VariableOp(state, [&x](auto& v, auto id, auto val) { x = v.Set(id, val); });
34 }
35
36 BENCHMARK(BM_VariableSet);
37
BM_VariableAdd(benchmark::State & state)38 static void BM_VariableAdd(benchmark::State& state) {
39 volatile int x = 0;
40 BM_VariableOp(state, [&x](auto& v, auto id, auto val) { x = v.Add(id, val); });
41 }
42
43 BENCHMARK(BM_VariableAdd);
44
BM_VariableSub(benchmark::State & state)45 static void BM_VariableSub(benchmark::State& state) {
46 volatile int x = 0;
47 BM_VariableOp(state, [&x](auto& v, auto id, auto val) { x = v.Sub(id, val); });
48 }
49
50 BENCHMARK(BM_VariableSub);
51
BM_VariableMult(benchmark::State & state)52 static void BM_VariableMult(benchmark::State& state) {
53 volatile int x = 0;
54 BM_VariableOp(state, [&x](auto& v, auto id, auto val) { x = v.Mult(id, val); });
55 }
56
57 BENCHMARK(BM_VariableMult);
58
BM_VariableDiv(benchmark::State & state)59 static void BM_VariableDiv(benchmark::State& state) {
60 volatile int x = 0;
61 BM_VariableOp(state, [&x](auto& v, auto id, auto val) { x = v.Div(id, val); });
62 }
63
64 BENCHMARK(BM_VariableDiv);
65
BM_VariableMod(benchmark::State & state)66 static void BM_VariableMod(benchmark::State& state) {
67 volatile int x = 0;
68 BM_VariableOp(state, [&x](auto& v, auto id, auto val) { x = v.Mod(id, val); });
69 }
70
71 BENCHMARK(BM_VariableMod);
72
BM_VariableSetRange(benchmark::State & state)73 static void BM_VariableSetRange(benchmark::State& state) {
74 BM_VariableOp(state, [](auto& v, auto, auto val) { v.SetRange(1, max_vars, val); });
75 }
76
77 BENCHMARK(BM_VariableSetRange);
78
BM_VariableAddRange(benchmark::State & state)79 static void BM_VariableAddRange(benchmark::State& state) {
80 BM_VariableOp(state, [](auto& v, auto, auto val) { v.AddRange(1, max_vars, val); });
81 }
82
83 BENCHMARK(BM_VariableAddRange);
84
BM_VariableSubRange(benchmark::State & state)85 static void BM_VariableSubRange(benchmark::State& state) {
86 BM_VariableOp(state, [](auto& v, auto, auto val) { v.SubRange(1, max_vars, val); });
87 }
88
89 BENCHMARK(BM_VariableSubRange);
90
BM_VariableMultRange(benchmark::State & state)91 static void BM_VariableMultRange(benchmark::State& state) {
92 BM_VariableOp(state, [](auto& v, auto, auto val) { v.MultRange(1, max_vars, val); });
93 }
94
95 BENCHMARK(BM_VariableMultRange);
96
BM_VariableDivRange(benchmark::State & state)97 static void BM_VariableDivRange(benchmark::State& state) {
98 BM_VariableOp(state, [](auto& v, auto, auto val) { v.DivRange(1, max_vars, val); });
99 }
100
101 BENCHMARK(BM_VariableDivRange);
102
BM_VariableModRange(benchmark::State & state)103 static void BM_VariableModRange(benchmark::State& state) {
104 BM_VariableOp(state, [](auto& v, auto, auto val) { v.ModRange(1, max_vars, val); });
105 }
106
107 BENCHMARK(BM_VariableModRange);
108
BM_VariableSetRangeVariable(benchmark::State & state)109 static void BM_VariableSetRangeVariable(benchmark::State& state) {
110 BM_VariableOp(state, [](auto& v, auto, auto val) { v.SetRangeVariable(1, max_vars, val); });
111 }
112
113 BENCHMARK(BM_VariableSetRangeVariable);
114
BM_VariableSetRangeVariableIndirect(benchmark::State & state)115 static void BM_VariableSetRangeVariableIndirect(benchmark::State& state) {
116 BM_VariableOp(state, [](auto& v, auto, auto val) { v.SetRangeVariableIndirect(1, max_vars, val); });
117 }
118
119 BENCHMARK(BM_VariableSetRangeVariableIndirect);
120
BM_VariableSetRangeRandom(benchmark::State & state)121 static void BM_VariableSetRangeRandom(benchmark::State& state) {
122 BM_VariableOp(state, [](auto& v, auto, auto val) { v.SetRangeRandom(1, max_vars, -100, 100); });
123 }
124
125 BENCHMARK(BM_VariableSetRangeRandom);
126
127 BENCHMARK_MAIN();
128