Solvespace
78 строк · 2.2 Кб
1//-----------------------------------------------------------------------------
2// Our harness for running benchmarks.
3//
4// Copyright 2016 whitequark
5//-----------------------------------------------------------------------------
6#include "solvespace.h"
7
8static bool RunBenchmark(std::function<void()> setupFn,
9std::function<bool()> benchFn,
10std::function<void()> teardownFn,
11size_t minIter = 5, double minTime = 5.0) {
12// Warmup
13setupFn();
14if(!benchFn()) {
15fprintf(stderr, "Benchmark failed\n");
16return false;
17}
18teardownFn();
19
20// Benchmark
21size_t iter = 0;
22double time = 0.0;
23while(iter < minIter || time < minTime) {
24setupFn();
25auto testStartTime = std::chrono::steady_clock::now();
26benchFn();
27auto testEndTime = std::chrono::steady_clock::now();
28teardownFn();
29
30std::chrono::duration<double> testTime = testEndTime - testStartTime;
31time += testTime.count();
32iter += 1;
33}
34
35// Report
36fprintf(stdout, "Iterations: %zd\n", iter);
37fprintf(stdout, "Time: %.3f s\n", time);
38fprintf(stdout, "Per iter.: %.3f s\n", time / (double)iter);
39
40return true;
41}
42
43int main(int argc, char **argv) {
44std::vector<std::string> args = Platform::InitCli(argc, argv);
45
46std::string mode;
47Platform::Path filename;
48if(args.size() == 3) {
49mode = args[1];
50filename = Platform::Path::From(args[2]);
51} else {
52fprintf(stderr, "Usage: %s [mode] [filename]\n", args[0].c_str());
53fprintf(stderr, "Mode can be one of: load.\n");
54return 1;
55}
56
57bool result = false;
58if(mode == "load") {
59result = RunBenchmark(
60[] {
61SS.Init();
62},
63[&] {
64if(!SS.LoadFromFile(filename))
65return false;
66SS.AfterNewFile();
67return true;
68},
69[] {
70SK.Clear();
71SS.Clear();
72});
73} else {
74fprintf(stderr, "Unknown mode \"%s\"\n", mode.c_str());
75}
76
77return (result == true ? 0 : 1);
78}
79