The code for evutil_gettimeofday() on Windows is:

        /* Conversion logic taken from Tor, which in turn took it
         * from Perl.  GetSystemTimeAsFileTime returns its value as
         * an unaligned (!) 64-bit value containing the number of
         * 100-nanosecond intervals since 1 January 1601 UTC. */
#define EPOCH_BIAS U64_LITERAL(116444736000000000)
#define UNITS_PER_SEC U64_LITERAL(10000000)
#define USEC_PER_SEC U64_LITERAL(1000000)
#define UNITS_PER_USEC U64_LITERAL(10)
        union {
                FILETIME ft_ft;
                ev_uint64_t ft_64;
        } ft;

        if (tv == NULL)
                return -1;

        GetSystemTimeAsFileTime(&ft.ft_ft);

        if (EVUTIL_UNLIKELY(ft.ft_64 < EPOCH_BIAS)) {
                /* Time before the unix epoch. */
                return -1;
        }
        ft.ft_64 -= EPOCH_BIAS;
        tv->tv_sec = (long) (ft.ft_64 / UNITS_PER_SEC);
        tv->tv_usec = (long) ((ft.ft_64 / UNITS_PER_USEC) % USEC_PER_SEC);
        return 0;

Note it ends with three 64-bit divisions.  Given the routine can be
(though shouldn't be) a hot path, a micro-optimization seems worth
considering:

        ft.ft_64 -= EPOCH_BIAS;
        tv->tv_sec = (long) (ft.ft_64 / UNITS_PER_SEC);
        tv->tv_usec = (long) ((ft.ft_64 - (UNITS_PER_SEC * tv->tv_sec)) /
UNITS_PER_USEC);

That substitutes a multiplication followed by subtraction in place of
the modulo 1 million.  While I haven't tested it, I believe mul + sub
will be faster than modulo (division).  I'm not actually using
libevent on Windows at this point.

Cheers,
Dave Hart
***********************************************************************
To unsubscribe, send an e-mail to majord...@freehaven.net with
unsubscribe libevent-users    in the body.

Reply via email to