Skip to content

Instantly share code, notes, and snippets.

@huwan
Last active May 14, 2020 02:50
Show Gist options
  • Select an option

  • Save huwan/ddba1b8b78b246a0514b2b4eb0476d0b to your computer and use it in GitHub Desktop.

Select an option

Save huwan/ddba1b8b78b246a0514b2b4eb0476d0b to your computer and use it in GitHub Desktop.

Revisions

  1. huwan revised this gist May 14, 2020. 1 changed file with 4 additions and 5 deletions.
    9 changes: 4 additions & 5 deletions benchmark_time.c
    Original file line number Diff line number Diff line change
    @@ -52,8 +52,10 @@ void
    benchmark_time_diff(benchmark_time_t *d, benchmark_time_t *t1,
    benchmark_time_t *t2)
    {
    #ifdef DEBUG
    print_timespec(t1, "t1");
    print_timespec(t2, "t2");
    #endif
    long long nsecs = (t2->tv_sec - t1->tv_sec) * NSECPSEC + t2->tv_nsec -
    t1->tv_nsec;
    assert(nsecs >= 0);
    @@ -137,13 +139,10 @@ benchmark_get_avg_get_time(void)
    return avg;
    }

    /* average time required to get a current time from the system */
    unsigned long long Get_time_avg;


    int main()
    {
    unsigned long long Get_time_avg;
    Get_time_avg = benchmark_get_avg_get_time();
    printf("%llu\n", Get_time_avg);
    printf("Average time required to get the current time from the system: %llu nanoseconds\n", Get_time_avg);
    return 0;
    }
  2. huwan revised this gist May 14, 2020. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion benchmark_time.c
    Original file line number Diff line number Diff line change
    @@ -118,12 +118,13 @@ benchmark_time_set(benchmark_time_t *time, unsigned long long nsecs)
    unsigned long long
    benchmark_get_avg_get_time(void)
    {
    size_t i;
    benchmark_time_t time;
    benchmark_time_t start;
    benchmark_time_t stop;

    benchmark_time_get(&start);
    for (size_t i = 0; i < N_PROBES_GET_TIME; i++) {
    for (i = 0; i < N_PROBES_GET_TIME; i++) {
    benchmark_time_get(&time);
    }
    benchmark_time_get(&stop);
  3. huwan created this gist Apr 14, 2019.
    148 changes: 148 additions & 0 deletions benchmark_time.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,148 @@
    #include <stdio.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>

    #define NSECPSEC 1000000000

    /*
    * benchmark_time.c -- benchmark_time module definitions
    */

    typedef struct timespec benchmark_time_t;

    void benchmark_time_get(benchmark_time_t *time);
    void benchmark_time_diff(benchmark_time_t *d, benchmark_time_t *t1,
    benchmark_time_t *t2);
    double benchmark_time_get_secs(benchmark_time_t *t);
    unsigned long long benchmark_time_get_nsecs(benchmark_time_t *t);
    int benchmark_time_compare(const benchmark_time_t *t1,
    const benchmark_time_t *t2);
    void benchmark_time_set(benchmark_time_t *time, unsigned long long nsecs);
    unsigned long long benchmark_get_avg_get_time(void);

    /*
    * os_clock_gettime -- clock_gettime abstraction layer
    */
    static int
    os_clock_gettime(int id, struct timespec *ts)
    {
    return clock_gettime(id, ts);
    }

    static void print_timespec(benchmark_time_t *diff, const char *name)
    {
    printf("%s.tv_sec=%ld %s.tv_nsec=%ld\n", name, diff->tv_sec, name, diff->tv_nsec);
    }

    /*
    * benchmark_time_get -- get timestamp from clock source
    */
    void
    benchmark_time_get(benchmark_time_t *time)
    {
    os_clock_gettime(CLOCK_MONOTONIC, time);
    }

    /*
    * benchmark_time_diff -- get time interval
    */
    void
    benchmark_time_diff(benchmark_time_t *d, benchmark_time_t *t1,
    benchmark_time_t *t2)
    {
    print_timespec(t1, "t1");
    print_timespec(t2, "t2");
    long long nsecs = (t2->tv_sec - t1->tv_sec) * NSECPSEC + t2->tv_nsec -
    t1->tv_nsec;
    assert(nsecs >= 0);
    d->tv_sec = nsecs / NSECPSEC;
    d->tv_nsec = nsecs % NSECPSEC;
    }

    /*
    * benchmark_time_get_secs -- get total number of seconds
    */
    double
    benchmark_time_get_secs(benchmark_time_t *t)
    {
    return (double)t->tv_sec + (double)t->tv_nsec / NSECPSEC;
    }

    /*
    * benchmark_time_get_nsecs -- get total number of nanoseconds
    */
    unsigned long long
    benchmark_time_get_nsecs(benchmark_time_t *t)
    {
    unsigned long long ret = t->tv_nsec;

    ret += t->tv_sec * NSECPSEC;

    return ret;
    }

    /*
    * benchmark_time_compare -- compare two moments in time
    */
    int
    benchmark_time_compare(const benchmark_time_t *t1, const benchmark_time_t *t2)
    {
    if (t1->tv_sec == t2->tv_sec)
    return (int)((long long)t1->tv_nsec - (long long)t2->tv_nsec);
    else
    return (int)((long long)t1->tv_sec - (long long)t2->tv_sec);
    }

    /*
    * benchmark_time_set -- set time using number of nanoseconds
    */
    void
    benchmark_time_set(benchmark_time_t *time, unsigned long long nsecs)
    {
    time->tv_sec = nsecs / NSECPSEC;
    time->tv_nsec = nsecs % NSECPSEC;
    }

    /*
    * number of samples used to calculate average time required to get a current
    * time from the system
    */
    #define N_PROBES_GET_TIME 10000000UL

    /*
    * benchmark_get_avg_get_time -- calculates average time required to get the
    * current time from the system in nanoseconds
    */
    unsigned long long
    benchmark_get_avg_get_time(void)
    {
    benchmark_time_t time;
    benchmark_time_t start;
    benchmark_time_t stop;

    benchmark_time_get(&start);
    for (size_t i = 0; i < N_PROBES_GET_TIME; i++) {
    benchmark_time_get(&time);
    }
    benchmark_time_get(&stop);

    benchmark_time_diff(&time, &start, &stop);

    unsigned long long avg =
    benchmark_time_get_nsecs(&time) / N_PROBES_GET_TIME;

    return avg;
    }

    /* average time required to get a current time from the system */
    unsigned long long Get_time_avg;


    int main()
    {
    Get_time_avg = benchmark_get_avg_get_time();
    printf("%llu\n", Get_time_avg);
    return 0;
    }