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