centip3de
centip3de

Reputation: 107

Erratic average execution times for C function

I'm trying to optimize a chunk of code given to me by a friend but my baseline for average execution times of it are extremely erratic and I'm lost to as why/how to fix it.

Code:

#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include "wall.h" /* Where his code is */

int main()
{
    int average;
    struct timeval tv;
    int i;

    for(i = 0; i < 1000; i++) /* Running his code 1,000 times */
    {
        gettimeofday(&tv, NULL); /* Starting time */ 

        start(); /* Launching his code */ 

        int ret = tv.tv_usec; /* Finishing time */ 
        ret /= 1000; /* Converting to milliseconds */ 
        average += ret; /* Adding to the average */ 
    }
    printf("Average execution time: %d milliseconds\n", average/1000);  
    return 0;
}

Output of 5 different runs:

I've tried multiple different ways of getting the average execution time, but each one either doesn't give me a precise enough answer or gives me a completely erratic one. I'm lost as to what to do now, any help would be greatly appreciated!

I know these types of benchmarks are very much system dependent, so I've listed my system specs below:

Edit

Thank you all for your input but I decided to go with a gprof instead of constructing my own. Thank you, once again!

Upvotes: 0

Views: 327

Answers (2)

paulsm4
paulsm4

Reputation: 121649

There are several problems here, including zero details on what the code you're benchmarking is doing, and that you're using "gettimeofday()" incorrectly (and, perhaps, inappropriately).

SUGGESTIONS:

1) Don't use "gettimeofday()":

http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time

2) Supplement your "time elapsed" with gprof:

http://www.cs.duke.edu/~ola/courses/programming/gprof.html

Upvotes: 1

Kninnug
Kninnug

Reputation: 8053

Your line int ret = tv.tv_usec; /* Finishing time */ doesn't give you the finishing time, it's still the starting time. You should make a second struct timeval, call gettimeofday with that and compare the two.

However, using clock() is probably easier. Of course, if you want to really analyse the performance of your code use a profiler.

Upvotes: 5

Related Questions