UNIX Programming. struct timeval how to print it (C-programming)

前端 未结 6 2018
慢半拍i
慢半拍i 2020-12-14 08:34

I am trying to print a value of type timeval. Actually I am able to print it, but I get the following warning:

Multiple markers at this line

  • format ‘%l
相关标签:
6条回答
  • 2020-12-14 09:04

    I just made up this handy little function from the info above. Self-contained except for needing time.h. Call it with the label you want wherever you want to know the time in your stdout stream.

    void timestamp(char *lbl) { // just outputs time and label
      struct timeval tval;
      int rslt;
      rslt = gettimeofday(&tval,NULL);
      if (rslt) printf("gettimeofday error\n");
      printf("%s timestamp: %ld.%06ld\n", lbl, tval.tv_sec, tval.tv_usec);
    }
    

    Typical output looks like: dpyfunc got ftqmut timestamp: 1537394319.501560

    And, you can surround the calls to it with a #ifdef to turn them on and off all at once by commenting out your #define. This could be useful almost like profiling but you can quickly disable it for production/release code. Like:

    #define TIMEDUMPS
    
    #ifdef TIMEDUMPS
    timestamp("function 1 start");
    #endif
    
    #ifdef TIMEDUMPS
    timestamp("function 2 start");
    #endif
    

    Comment out the #define TIMEDUMPS and it turns all of them off. No matter how many, in how many source code files.

    0 讨论(0)
  • 2020-12-14 09:06

    Yes , timeval is defined like this

    struct timeval { 
        time_t      tv_sec; 
        suseconds_t tv_usec; 
    } 
    

    Using

    printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 
    

    will surely of help.

    0 讨论(0)
  • 2020-12-14 09:08

    Since struct timeval will be declared something like:

    struct timeval {
        time_t      tv_sec;
        suseconds_t tv_usec;
    }
    

    you need to get at the underlying fields:

    printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
    printf ("%ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
    
    0 讨论(0)
  • 2020-12-14 09:09

    In the GNU C Library, struct timeval:

    is declared in sys/time.h and has the following members:

    long int tv_sec
    

    This represents the number of whole seconds of elapsed time.

    long int tv_usec
    

    This is the rest of the elapsed time (a fraction of a second), represented as the number of microseconds. It is always less than one million.

    So you will need to do

    printf("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
    

    to get a "nicely formatted" timestamp like 1.000123.

    0 讨论(0)
  • 2020-12-14 09:17

    yeah its

    int main( void )
    {
        clock_t start, stop;
        long int x;
        double duration;
        static struct timeval prev;
        struct timeval now;
    
        start = clock();  // get number of ticks before loop
    
        for( x = 0; x < 1000000000; x++ );
        // sleep(100);
    
        stop = clock();  // get number of ticks after loop
    
        // calculate time taken for loop
        duration = ( double ) ( stop - start ) / CLOCKS_PER_SEC;
    
        printf( "\nThe number of seconds for loop to run was %.2lf\n", duration );
    
        gettimeofday(&now, NULL);
        prev.tv_sec = duration;
        if (prev.tv_sec)
        {
            int diff = (now.tv_sec-prev.tv_sec)*1000+(now.tv_usec-prev.tv_usec)/1000;
            printf("DIFF %d\n",diff);
        }
    
        return 0;
    
    }
    
    0 讨论(0)
  • 2020-12-14 09:18

    .tv_sec can be -ve and when this happens, .tv_usec biased (forced to the range [0..1000000), hence:

    #include <stdint.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/time.h>
    
    static void frac(intmax_t usec)
    {
        int precision = 6;
        while (usec % 10 == 0 && precision > 1) {
            precision--;
            usec = usec / 10;
        }
        printf(".%0*jd", precision, usec);
    }
    
    static void print_timeval(struct timeval tv)
    {
        struct timeval d;
        /*
         * When .tv_sec is -ve, .tv_usec is biased (it's forced to the
         * range 0..1000000 and then .tv_sec gets adjusted).  Rather
         * than deal with that convert -ve values to +ve.
         */
        if (tv.tv_sec < 0) {
            printf("-");
            struct timeval zero = {0,};
            timersub(&zero, &tv, &d);
        } else {
            d = tv;
        }
        printf("%jd", (intmax_t)d.tv_sec);
        if (d.tv_usec > 0) {
            frac(d.tv_usec);
        }
    }
    
    int main()
    {
        for (intmax_t i = 1000000; i > 0; i = i / 10) {
            for (intmax_t j = 1000000; j > 0; j = j / 10) {
                struct timeval a = { .tv_sec = i / 1000000, .tv_usec = i % 1000000, };
                struct timeval b = { .tv_sec = j / 1000000, .tv_usec = j % 1000000, };
                struct timeval d;
                timersub(&a, &b, &d);
                printf("%7jd us - %7jd us = %7jd us | %2jd.%06jd - %2jd.%06jd = %2jd.%06jd | ",
                       i, j, i - j,
                       (intmax_t)a.tv_sec, (intmax_t)a.tv_usec,
                       (intmax_t)b.tv_sec, (intmax_t)b.tv_usec,
                       (intmax_t)d.tv_sec, (intmax_t)d.tv_usec);
                print_timeval(d);
                printf("\n");
            }
        }
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题