From 5020ffbe4936357db1e376d12532af2efc9cb6bb Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 23 Apr 2021 16:04:18 +0200 Subject: [PATCH] MINOR: time: avoid u64 needlessly expensive computations for the 32-bit now_ms The compiler cannot guess that tv_sec or tv_usec might have unused parts, so the multiply by 1000 and the divide by 1000 are both performed using 64-bit constants to stick to the common type. This is not needed since we only keep the final 32 bits, let's help the compiler here by casting these fields to uint. The tv_update_date() code is much cleaner (48 bytes smaller in the CAS loop) as it avoids some register spilling at a location where that's really unwanted. --- include/haproxy/time.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/haproxy/time.h b/include/haproxy/time.h index 0ce06decc..a556af2a5 100644 --- a/include/haproxy/time.h +++ b/include/haproxy/time.h @@ -140,14 +140,14 @@ static inline struct timeval *tv_zero(struct timeval *tv) { #define tv_iszero(tv) (((tv)->tv_sec | (tv)->tv_usec) == 0) /* - * Converts a struct timeval to a number of milliseconds. + * Converts a struct timeval to a wrapping number of milliseconds. */ -static inline unsigned long __tv_to_ms(const struct timeval *tv) +static inline uint __tv_to_ms(const struct timeval *tv) { - unsigned long ret; + unsigned int ret; - ret = tv->tv_sec * 1000; - ret += tv->tv_usec / 1000; + ret = (uint)tv->tv_sec * 1000; + ret += (uint)tv->tv_usec / 1000; return ret; }