Skip to content

Commit b1ab4f0

Browse files
committed
Adding benchmark
1 parent 5edcf16 commit b1ab4f0

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

BUILD

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,9 @@ cc_binary(
99
srcs = ["scratch.cc"],
1010
deps = [":soa"]
1111
)
12+
13+
cc_binary(
14+
name = "benchmark",
15+
srcs = ["benchmark.cc", "tictoc.hpp"],
16+
deps = [":soa"]
17+
)

benchmark.cc

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#include <iostream>
2+
#include <cstdint>
3+
#include <random>
4+
#include <array>
5+
#include "vapid/soa.h"
6+
#include "tictoc.hpp"
7+
8+
using Id = unsigned short;
9+
10+
std::default_random_engine gen;
11+
std::uniform_int_distribution<Id> sensor_id_gen(0, 100);
12+
std::uniform_int_distribution<Id> object_id_gen(0, 10);
13+
std::uniform_real_distribution<double> real_gen(-10.0, 10.0);
14+
15+
struct SensorData {
16+
std::array<double, 18> xyz;
17+
18+
static SensorData random() {
19+
SensorData s;
20+
for (size_t i = 0; i < s.xyz.size(); ++i) {
21+
s.xyz[i] = real_gen(gen);
22+
}
23+
return s;
24+
};
25+
};
26+
27+
template <typename... Ts>
28+
std::ostream& operator<<(std::ostream& cout, const SensorData& s) {
29+
cout << "{" << s.xyz[0] << ", " << s.xyz[1] << ", " << s.xyz[2] << "}";
30+
return cout;
31+
}
32+
33+
struct Measurement {
34+
Id sensor_id;
35+
Id object_id;
36+
double timestamp;
37+
SensorData data;
38+
39+
static Measurement random() {
40+
Measurement m;
41+
m.sensor_id = sensor_id_gen(gen);
42+
m.object_id = object_id_gen(gen);
43+
m.timestamp = real_gen(gen);
44+
m.data = SensorData::random();
45+
return m;
46+
}
47+
};
48+
49+
template <typename... Ts>
50+
std::ostream& operator<<(std::ostream& cout, const Measurement& m) {
51+
cout << "Measurement{" << m.sensor_id << ", " << m.object_id << ", " << m.timestamp << ", " << m.data << "}";
52+
return cout;
53+
}
54+
55+
struct TestCase {
56+
vapid::soa<Id, Id, double, SensorData> measurements_soa;
57+
std::vector<Measurement> measurements_vec;
58+
59+
static TestCase random() {
60+
TestCase t;
61+
for (int i = 0; i < 100000; ++i) {
62+
Measurement m = Measurement::random();
63+
t.measurements_vec.push_back(m);
64+
t.measurements_soa.insert(m.sensor_id, m.object_id, m.timestamp, m.data);
65+
}
66+
return t;
67+
}
68+
};
69+
70+
int main(int argc, char* argv[])
71+
{
72+
TicToc tictoc;
73+
double soa_sort_time = 0;
74+
double soa_sum_time = 0;
75+
double vec_sort_time = 0;
76+
double vec_sum_time = 0;
77+
TestCase t0 = TestCase::random();
78+
t0.measurements_soa.prepare_tmp();
79+
80+
int num_trials = 10;
81+
for (int trial = 0; trial <= num_trials; ++trial) {
82+
std::cout << "\rrunning trial " << trial << "/" << num_trials << std::flush;
83+
TestCase t = t0;
84+
85+
// soa sort
86+
tictoc.tic();
87+
t.measurements_soa.sort_by_field<0>();
88+
soa_sort_time += tictoc.toc();
89+
90+
// soa sum
91+
tictoc.tic();
92+
double soa_sum = 0;
93+
for (double d : t.measurements_soa.get_column<2>()) {
94+
soa_sum += d;
95+
}
96+
soa_sum_time += tictoc.toc();
97+
98+
// vec sort
99+
tictoc.tic();
100+
std::stable_sort(t.measurements_vec.begin(),
101+
t.measurements_vec.end(),
102+
[](auto& m1, auto& m2) {
103+
return m1.sensor_id < m2.sensor_id;
104+
});
105+
vec_sort_time += tictoc.toc();
106+
107+
// vec sum
108+
tictoc.tic();
109+
double vec_sum = 0;
110+
for (const auto& meas : t.measurements_vec) {
111+
vec_sum += meas.timestamp;
112+
}
113+
vec_sum_time += tictoc.toc();
114+
115+
if (argc == 1234) {
116+
// prevent optimization
117+
std::cout << t.measurements_soa.get_column<0>()[0] << "\n";
118+
std::cout << t.measurements_vec[0].timestamp << "\n";
119+
std::cout << vec_sum << "\n";
120+
std::cout << soa_sum << "\n";
121+
122+
}
123+
}
124+
std::cout << "\rbenchmark results ==============" << std::endl;
125+
126+
std::cout << "soa sort time " << soa_sort_time << std::endl;
127+
std::cout << "vec sort time " << vec_sort_time << std::endl;
128+
129+
std::cout << "soa sum time " << soa_sum_time << std::endl;
130+
std::cout << "vec sum time " << vec_sum_time << std::endl;
131+
132+
return 0;
133+
}

tictoc.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <iostream>
4+
#include <chrono>
5+
6+
class TicToc {
7+
public:
8+
void tic() {
9+
tic_time = std::chrono::high_resolution_clock::now();
10+
}
11+
12+
double toc() {
13+
auto toc_time = std::chrono::high_resolution_clock::now();
14+
return (toc_time - tic_time).count() * 1E-9;
15+
}
16+
private:
17+
std::chrono::high_resolution_clock::time_point tic_time;
18+
};
19+

0 commit comments

Comments
 (0)