1+ #define ANKERL_NANOBENCH_IMPLEMENT
2+ #include " nanobench.hpp"
3+
4+ #include < oryx/chron/parser.hpp>
5+ #include < oryx/chron/randomization.hpp>
6+
7+ #include < libcron/CronData.h>
8+ #include < libcron/CronRandomization.h>
9+
10+ using namespace oryx ::chron;
11+ using namespace ankerl ;
12+
13+ const std::string kRandomSchedule = " R(0-59) R(0-59) R(0-23) R(1-31) R(JAN-DEC) ?" ;
14+
15+ template <typename Parser>
16+ void bench (ankerl::nanobench::Bench* bench, char const * name) {
17+ Parser parser;
18+ Randomization rng;
19+
20+ bench->run (name, [&] { ankerl::nanobench::doNotOptimizeAway (parser (rng.Parse (kRandomSchedule ).value ()).value ()); });
21+ }
22+
23+ void bench (ankerl::nanobench::Bench* bench, char const * name) {
24+ Randomization rng;
25+
26+ bench->run (name, [&] {
27+ ankerl::nanobench::doNotOptimizeAway (libcron::CronData::create (rng.Parse (kRandomSchedule ).value ()));
28+ });
29+ }
30+
31+ auto main () -> int {
32+ static const auto kCachedParse = CachedExpressionParser ();
33+ static const auto kMtx = CachedExpressionParser<std::mutex>();
34+
35+ ankerl::nanobench::Bench b;
36+ b.title (" Parsing randomized Expressions" ).epochIterations (20000 ).relative (true ).performanceCounters (true );
37+
38+ bench<ExpressionParser>(&b, " ExpressionParser" );
39+ bench<CachedExpressionParser<>>(&b, " CachedExpressionParser<NullMutex>" );
40+ bench<CachedExpressionParser<std::mutex>>(&b, " CachedExpressionParser<std::mutex>" );
41+ bench (&b, " libcron::CronData::create" );
42+
43+ ankerl::nanobench::Bench b2;
44+ Randomization rng1;
45+ libcron::CronRandomization rng2;
46+
47+ b2.title (" Randomization" ).epochIterations (100000 ).relative (true ).performanceCounters (true );
48+ b2.run (" chron-cpp" , [&] {
49+ auto r = rng1.Parse (kRandomSchedule );
50+ nanobench::doNotOptimizeAway (r);
51+ });
52+ b2.run (" libcron" , [&] {
53+ auto r = rng2.parse (kRandomSchedule );
54+ nanobench::doNotOptimizeAway (r);
55+ });
56+ }
0 commit comments