How can I get a high resolution time stamp as a double?
I am trying to use the follow code:
std::chrono::high_resolution_clock::now();
to get a time stamp, but I need it as a double, but it isn't a support data type, auto works, but I cannot manipulate it.
Solution 1:
Your "time stamp" is what the <chrono>
library calls a time_point
. A time_point
is a collection of a clock, and duration. And a duration is a collection of a representation and period.
You have specified two out of these three:
clock == high_resolution_clock
representation == double
-
period ==
?
Your period can be nano
(ratio<1, 1000000000>
), milli
(ratio<1, 1000>
), seconds
(ratio<1>
), minutes
(ratio<60>
) or any other rational relationship to seconds.
Let's say for example that you wanted a time stamp using double as the representation and seconds as the period. This would look like this:
using clock = std::chrono::high_resolution_clock;
using dsec = std::chrono::duration<double>;
using tps = std::chrono::time_point<clock, dsec>;
tps tp = clock::now();
The time_point
emitted by high_resolution_clock::now()
will implicitly convert to your time_point
using a representation of double and a period of ratio<1>. It will hold fractional seconds since the epoch of high_resolution_clock
.
In general, because your destination type has a floating point representation, all time_point source types will implicitly convert to it. To convert in the reverse direction, you would need to use std::chrono::time_point_cast<some-duration>(source-time_point)
.
If instead you wanted to hold double-based nanoseconds, that would look like:
using clock = std::chrono::high_resolution_clock;
using dns = std::chrono::duration<double, std::nano>;
using tpns = std::chrono::time_point<clock, dns>;
tpns tp = clock::now();
As a guideline, I recommend using either system_clock
or steady_clock
, but not high_resolution_clock
. Use system_clock
if your time_point
needs to have some relationship with the civil calendar, or needs to maintain meaning across processes. Use steady_clock
if your time_point
is used only across short durations within the same process.
high_resolution_clock
is (de-facto) always an alias to either system_clock
or steady_clock
. So you might as well use one of the latter, and know what you're getting.
using clock = std::chrono::system_clock;
using dsec = std::chrono::duration<double>;
using tps = std::chrono::time_point<clock, dsec>;
tps tp = clock::now();
Solution 2:
std::chrono::high_resolution_clock::now()
returns an std::time_point<std::chrono::high_resolution_clock>
. Here, you can choose whether you want to express this time point in nanoseconds, microseconds, milliseconds, and so on, using a std::chrono::duration
, and ultimately convert this to a double
:
std::chrono::time_point<std::chrono::high_resolution_clock> tp = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::micro> dur = tp;
double micros = dur.count();
Here you can replace std::micro
with whatever resolution you desire.