Module Time_stamp_counter.Calibrator

A calibrator contains a snapshot of machine-specific information that is used to convert between TSC values and clock time. This information needs to be calibrated periodically such that it stays updated w.r.t. changes in the CPU's time-stamp-counter frequency, which can vary depending on load, heat, etc. (Also see the comment in the .ml file.)

Calibration at the rate of 0.1, 1 or 2 secs produces errors (measured as the difference between Time.now and the reported time here) on the order of 1-2us. Given the precision of 52-bit float mantissa values, this is very close to the least error one can have on these values. Calibration once per 10sec produces errors that are +/-4us. Calibration once per minute produces errors that are +/-15us and calibration once in 3mins produces errors +/-30us. (It is worth remarking that the error has a positive bias of 1us -- i.e., the error dances around the 1us mark, rather than around 0. It is unclear where this bias is introduced, though it probably does not matter for most applications.)

This module maintains an instance of t internal to the module. The internal instance of t can be updated via calls to calibrate (), i.e., without specifying the t parameter. In all the functions below that take an optional Calibrator.t argument, the internal instance is used when no calibrator is explicitly specified.

type tsc
type t
include Bin_prot.Binable.S with type t := t
type t
include Bin_prot.Binable.S_only_functions with type t := t
type t
val bin_size_t : t Bin_prot.Size.sizer
val bin_write_t : t Bin_prot.Write.writer
val bin_read_t : t Bin_prot.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot.Read.reader

This function only needs implementation if t exposed to be a polymorphic variant. Despite what the type reads, this does *not* produce a function after reading; instead it takes the constructor tag (int) before reading and reads the rest of the variant t afterwards.

val bin_shape_t : Bin_prot.Shape.t
val bin_writer_t : t Bin_prot.Type_class.writer
val bin_reader_t : t Bin_prot.Type_class.reader
val bin_t : t Bin_prot.Type_class.t
include Ppx_sexp_conv_lib.Sexpable.S with type t := t
type t
val t_of_sexp : Sexplib0.Sexp.t -> t
val sexp_of_t : t -> Sexplib0.Sexp.t
val create : unit -> t

create () creates an uninitialized calibrator instance. Creating a calibrator takes about 3ms. One needs a recently calibrated Calibrator.t and the TSC value from the same machine to meaningfully convert the TSC value to a Time.t.

val calibrate : t -> unit

calibrate t updates t by measuring the current value of the TSC and Time.now.

val cpu_mhz : (t -> float) Core_kernel.Or_error.t

Returns the estimated MHz of the CPU's time-stamp-counter based on the TSC and Time.now (). This function is undefined on 32-bit machines.