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.
This commit is contained in:
Willy Tarreau 2021-04-23 16:04:18 +02:00
parent 1f9e11e7f0
commit 5020ffbe49

View File

@ -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;
}