qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [Qemu-devel] [PATCH v1 02/26] qemu-io-cmds: use clock_g


From: Richard Henderson
Subject: Re: [Qemu-block] [Qemu-devel] [PATCH v1 02/26] qemu-io-cmds: use clock_gettime for benchmarking
Date: Thu, 30 May 2019 13:41:29 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0

On 5/30/19 5:15 AM, Alex Bennée wrote:
> -static struct timeval tsub(struct timeval t1, struct timeval t2)
> +static struct timespec tsub(struct timespec t1, struct timespec t2)
>  {
> -    t1.tv_usec -= t2.tv_usec;
> -    if (t1.tv_usec < 0) {
> -        t1.tv_usec += 1000000;
> +    t1.tv_nsec -= t2.tv_nsec;
> +    if (t1.tv_nsec < 0) {
> +        t1.tv_nsec += 1000000000;

Rather than counting zeros, should we move or copy NANOSECONDS_PER_SECOND?

> +    double time = (double)tv.tv_sec + ((double)tv.tv_nsec / 1000000000.0);

On that same vein, I'll note this can also be spelled "1e9".
Also, the casts to double are superfluous, once we have one FP constant.

> +static void timestr(struct timespec *tv, char *ts, size_t size, int format)
>  {
> -    double usec = (double)tv->tv_usec / 1000000.0;
> +    double nsec = (double)tv->tv_nsec / 1000000000.0;

Similarly.

>  
>      if (format & TERSE_FIXED_TIME) {
>          if (!HOURS(tv->tv_sec)) {
>              snprintf(ts, size, "%u:%02u.%02u",
>                      (unsigned int) MINUTES(tv->tv_sec),
>                      (unsigned int) SECONDS(tv->tv_sec),
> -                    (unsigned int) (usec * 100));
> +                    (unsigned int) (nsec * 100000));

The multiplier here is wrong.

The existing formatting here is bonkers, which doesn't help.  Why should we
convert to double, divide into a fraction of a second, shift the decimal place,
and truncate conversion to integer?

The formatting should clearly be

  snprintf(ts, size, "%u:%05.2f",
           (unsigned int) MINUTES(tv->tv_sec),
           SECONDS(tv->tv_sec) + nsec);

so that the complete seconds plus fraction of a second is rounded to two digits
after the decimal point, and is left-padded with 0's so that the entire number
fits in 5 characters, not forgetting the decimal point itself (i.e. 00.00).

Likewise to the other two occurrences in this function.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]