Repository navigation
Expand file tree
/
Copy pathbenchmark.cpp
More file actions
119 lines (101 loc) · 2.93 KB
/
Copy pathbenchmark.cpp
File metadata and controls
119 lines (101 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "benchmark.h"
#include <chrono>
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
#include "../util/terminalColor.h"
#include "../util/parseCPUIDArgs.h"
std::vector<Benchmark*>* knownBenchmarks = nullptr;
Benchmark::Benchmark(const char* name) : name(name) {
if(knownBenchmarks == nullptr) { knownBenchmarks = new std::vector<Benchmark*>(); }
knownBenchmarks->push_back(this);
}
Benchmark* getBenchFor(std::string id) {
if(id.length() == 0) return nullptr;
if(id[0] >= '0' && id[0] <= '9') {
return (*knownBenchmarks)[std::stoi(id)];
} else {
for(Benchmark* b : *knownBenchmarks) {
if(id == b->name) {
return b;
}
}
}
return nullptr;
}
std::vector<std::string> split(std::string str, char splitChar) {
std::vector<std::string> substrings;
int lastIndex = 0;
int index = 0;
while(index < str.length()) {
while(str[index] != splitChar) {
index++;
}
substrings.push_back(str.substr(lastIndex, index - lastIndex));
index++;
lastIndex = index;
}
return substrings;
}
static void runBenchmark(Benchmark* bench) {
setColor(TerminalColor::CYAN);
auto createStart = std::chrono::high_resolution_clock::now();
bench->init();
auto createFinish = std::chrono::high_resolution_clock::now();
std::cout << bench->name << ": ";
std::cout.flush();
setColor(TerminalColor::YELLOW);
std::cout << '(' << (createFinish - createStart).count() / 1000000.0 << "ms)";
std::cout.flush();
auto runStart = std::chrono::high_resolution_clock::now();
bench->run();
auto runFinish = std::chrono::high_resolution_clock::now();
double deltaTimeMS = (runFinish - runStart).count() / 1000000.0;
setColor(TerminalColor::GREEN);
std::cout << " (" << deltaTimeMS << "ms)\n";
std::cout.flush();
bench->printResults(deltaTimeMS);
}
static void runBenchmarks(const std::vector<std::string>& benchmarks) {
setColor(TerminalColor::CYAN);
std::cout << "[NAME]";
setColor(TerminalColor::YELLOW);
std::cout << " [INITIALIZATION]";
setColor(TerminalColor::GREEN);
std::cout << " [RUNTIME]\n";
setColor(TerminalColor::WHITE);
for(const std::string& c : benchmarks) {
Benchmark* b = getBenchFor(c);
if(b != nullptr) {
runBenchmark(b);
}
}
}
int main(int argc, const char** args) {
Util::ParsedArgs pa(argc, args);
std::cout << Util::printAndParseCPUIDArgs(pa).c_str() << "\n";
if(pa.argCount() >= 1) {
runBenchmarks(pa.args());
} else {
setColor(TerminalColor::WHITE);
std::cout << "The following benchmarks are available:\n";
setColor(TerminalColor::CYAN);
for(std::size_t i = 0; i < knownBenchmarks->size(); i++) {
std::cout << i << ") " << (*knownBenchmarks)[i]->name << "\n";
}
setColor(TerminalColor::WHITE);
std::cout << "Run> ";
setColor(TerminalColor::GREEN);
std::string cmd;
std::cin >> cmd;
if(cmd.empty()) {
setColor(TerminalColor::WHITE);
return 0;
}
cmd.append(";");
std::vector<std::string> commands = split(cmd, ';');
runBenchmarks(commands);
}
return 0;
}