34 #ifndef GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H
35 #define GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H
37 #include <grpc/support/sync.h>
38 #include <grpc/support/time.h>
41 #ifdef GRPC_TIMERS_RDTSC
46 __asm__
volatile(
"rdtsc" :
"=A"(ret));
51 #elif defined(__x86_64__) || defined(__amd64__)
53 unsigned long long low, high;
54 __asm__
volatile(
"rdtsc" :
"=a"(low),
"=d"(high));
55 *clk = (high << 32) | low;
58 static gpr_once precise_clock_init = GPR_ONCE_INIT;
59 static double cycles_per_second = 0.0;
60 static void grpc_precise_clock_init() {
61 time_t start = time(NULL);
64 while (time(NULL) == start)
66 grpc_precise_clock_now(&start_time);
67 while (time(NULL) == start + 1)
69 grpc_precise_clock_now(&end_time);
70 cycles_per_second = end_time - start_time;
72 static double grpc_precise_clock_scaling_factor() {
73 gpr_once_init(&precise_clock_init, grpc_precise_clock_init);
74 return 1e6 / cycles_per_second;
76 #define GRPC_PRECISE_CLOCK_FORMAT "%f"
77 #define GRPC_PRECISE_CLOCK_PRINTF_ARGS(clk) \
78 (*(clk)*grpc_precise_clock_scaling_factor())
85 clk->clock = gpr_now();
87 #define GRPC_PRECISE_CLOCK_FORMAT "%ld.%09d"
88 #define GRPC_PRECISE_CLOCK_PRINTF_ARGS(clk) \
89 (clk)->clock.tv_sec, (clk)->clock.tv_nsec
91 fprintf(fp,
"%ld.%09d", clk->clock.tv_sec, clk->clock.tv_nsec);
Definition: timers_preciseclock.h:81