Botan 2.19.2
Crypto and TLS for C&
timer.h
Go to the documentation of this file.
1/*
2* (C) 2018 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#ifndef BOTAN_TIMER_H_
8#define BOTAN_TIMER_H_
9
10#include <botan/types.h>
11#include <string>
12#include <chrono>
13
14namespace Botan {
15
17 {
18 public:
19 Timer(const std::string& name,
20 const std::string& provider,
21 const std::string& doing,
22 uint64_t event_mult,
23 size_t buf_size,
24 double clock_cycle_ratio,
25 uint64_t clock_speed)
26 : m_name(name + ((provider.empty() || provider == "base") ? "" : " [" + provider + "]"))
27 , m_doing(doing)
28 , m_buf_size(buf_size)
29 , m_event_mult(event_mult)
30 , m_clock_cycle_ratio(clock_cycle_ratio)
31 , m_clock_speed(clock_speed)
32 {}
33
34 Timer(const std::string& name) :
35 Timer(name, "", "", 1, 0, 0.0, 0)
36 {}
37
38 Timer(const std::string& name, size_t buf_size) :
39 Timer(name, "", "", buf_size, buf_size, 0.0, 0)
40 {}
41
42 Timer(const Timer& other) = default;
43 Timer& operator=(const Timer& other) = default;
44
45 void start();
46
47 void stop();
48
49 bool under(std::chrono::milliseconds msec)
50 {
51 return (milliseconds() < msec.count());
52 }
53
55 {
56 public:
57 explicit Timer_Scope(Timer& timer)
58 : m_timer(timer)
59 {
60 m_timer.start();
61 }
63 {
64 try
65 {
66 m_timer.stop();
67 }
68 catch(...) {}
69 }
70 private:
71 Timer& m_timer;
72 };
73
74 template<typename F>
75 auto run(F f) -> decltype(f())
76 {
77 Timer_Scope timer(*this);
78 return f();
79 }
80
81 template<typename F>
82 void run_until_elapsed(std::chrono::milliseconds msec, F f)
83 {
84 while(this->under(msec))
85 {
86 run(f);
87 }
88 }
89
90 uint64_t value() const
91 {
92 return m_time_used;
93 }
94
95 double seconds() const
96 {
97 return milliseconds() / 1000.0;
98 }
99
100 double milliseconds() const
101 {
102 return value() / 1000000.0;
103 }
104
105 double ms_per_event() const
106 {
107 return milliseconds() / events();
108 }
109
110 uint64_t cycles_consumed() const
111 {
112 if(m_clock_speed != 0)
113 {
114 return static_cast<uint64_t>((m_clock_speed * value()) / 1000.0);
115 }
116 return m_cpu_cycles_used;
117 }
118
119 uint64_t events() const
120 {
121 return m_event_count * m_event_mult;
122 }
123
124 const std::string& get_name() const
125 {
126 return m_name;
127 }
128
129 const std::string& doing() const
130 {
131 return m_doing;
132 }
133
134 size_t buf_size() const
135 {
136 return m_buf_size;
137 }
138
139 double bytes_per_second() const
140 {
141 return seconds() > 0.0 ? events() / seconds() : 0.0;
142 }
143
144 double events_per_second() const
145 {
146 return seconds() > 0.0 ? events() / seconds() : 0.0;
147 }
148
149 double seconds_per_event() const
150 {
151 return events() > 0 ? seconds() / events() : 0.0;
152 }
153
154 void set_custom_msg(const std::string& s)
155 {
156 m_custom_msg = s;
157 }
158
159 bool operator<(const Timer& other) const;
160
161 std::string to_string() const;
162
163 private:
164 std::string result_string_bps() const;
165 std::string result_string_ops() const;
166
167 // const data
168 std::string m_name, m_doing;
169 size_t m_buf_size;
170 uint64_t m_event_mult;
171 double m_clock_cycle_ratio;
172 uint64_t m_clock_speed;
173
174 // set at runtime
175 std::string m_custom_msg;
176 uint64_t m_time_used = 0, m_timer_start = 0;
177 uint64_t m_event_count = 0;
178
179 uint64_t m_max_time = 0, m_min_time = 0;
180 uint64_t m_cpu_cycles_start = 0, m_cpu_cycles_used = 0;
181 };
182
183}
184
185#endif
Timer_Scope(Timer &timer)
Definition: timer.h:57
Timer(const std::string &name, size_t buf_size)
Definition: timer.h:38
double milliseconds() const
Definition: timer.h:100
double events_per_second() const
Definition: timer.h:144
uint64_t value() const
Definition: timer.h:90
Timer(const std::string &name)
Definition: timer.h:34
bool under(std::chrono::milliseconds msec)
Definition: timer.h:49
uint64_t cycles_consumed() const
Definition: timer.h:110
Timer & operator=(const Timer &other)=default
double ms_per_event() const
Definition: timer.h:105
double seconds_per_event() const
Definition: timer.h:149
void set_custom_msg(const std::string &s)
Definition: timer.h:154
auto run(F f) -> decltype(f())
Definition: timer.h:75
Timer(const Timer &other)=default
Timer(const std::string &name, const std::string &provider, const std::string &doing, uint64_t event_mult, size_t buf_size, double clock_cycle_ratio, uint64_t clock_speed)
Definition: timer.h:19
const std::string & get_name() const
Definition: timer.h:124
size_t buf_size() const
Definition: timer.h:134
uint64_t events() const
Definition: timer.h:119
const std::string & doing() const
Definition: timer.h:129
void run_until_elapsed(std::chrono::milliseconds msec, F f)
Definition: timer.h:82
double seconds() const
Definition: timer.h:95
double bytes_per_second() const
Definition: timer.h:139
std::string name
int(* final)(unsigned char *, CTX *)
#define BOTAN_TEST_API
Definition: compiler.h:51
Definition: alg_id.cpp:13
bool operator<(const OID &a, const OID &b)
Definition: asn1_oid.cpp:132
std::string to_string(ErrorType type)
Convert an ErrorType to string.
Definition: exceptn.cpp:11