utils: add a coarse clock
utils: add a coarse clock

Implement a millisecond-resolution `std::chrono`-style clock using
`CLOCK_MONOTONIC_COARSE`.  The use cases are those where you care
about clock sampling latency more than about accuracy.

Assuming non-ancient versions of the kernel & libc, all clock types
recognized by `clock_gettime()` are implemented through a vDSO, so
`clock_gettime()` is not an actual system call.  That means that even
`CLOCK_MONOTONIC` (which is what `std::chrono::steady_clock` uses) is
not terribly expensive in practice.

But `CLOCK_MONOTONIC_COARSE` is still 3.5 times faster than that (on
my machine the latencies are 4ns versus 14ns) and is also supposed to
be easier on the cache.

The actual granularity of `CLOCK_MONOTONIC_COARSE` is tick (on x86-64,
anyway) -- but `getclock_getres()` says it has millisecond resolution,
so we use that.

Signed-off-by: Michael Livshin <ae60993c65de9cdf2ca07b7426c976808535d555@scylladb.com>

scylladb/scylla,scylladb/scylla,scylladb/scylla,scylladb/scylla