2010-02-04 3 views
3

Мне нужен инструмент для измерения времени выполнения программы, например gprof. Но разрешение gprof недостаточно хорошее (около 0,01 секунды). oprofile, похоже, может это сделать, я попытаюсь узнать, как получить данные о информации о времени, но я не могу.Измерение времени выполнения программы

Итак, кто может сказать мне, как это сделать, или кто-нибудь знает, что другой инструмент может сделать то же самое?

ответ

6

Измерение времени выполнения всей программы редко при использовании с высоким разрешением; есть слишком много накладных расходов, которые вы обычно не хотите включать, когда вы профилируете вещи.

Часто бывает лучше измерять время выполнения только определенного критического пути, и даже тогда часто бывает полезно повторить выполнение этого пути много раз, чтобы улучшить точность синхронизации.

В системах/POSIX Linux, gettimeofday() часто используются для такого времени, он имеет микросекунды точности:

#include <sys/time.h> 
#include <time.h> 
#include <stdio.h> 

int main(void) 
{ 
    struct timeval then, now; 
    int i; 

    gettimeofday(&then, NULL); 
    for(i = 0; i < 100000; i++) 
    my_interesting_function(); 
    gettimeofday(&now, NULL); 

    printf("Did %d executions in %.3g seconds\n", i, now.tv_sec - then.tv_sec + 1e-6 * (now.tv_usec - then.tv_usec)); 

    return 0; 
} 

выше предполагает, что my_interesting_function() является функцией, производительность вы хотите измерить. Конечно, настройте количество повторений в зависимости от фактического времени выполнения функции.

+0

может у показать пример или шаги, чтобы сделать это? – martin

+0

это хорошо! Спасибо тебе большое! – martin

+0

@martin: Если вы чувствуете, что это помогло вам, конечно, не стесняйтесь повышать и/или принимать его. – unwind

0

Если вы используете Linux/MacOSX/Unix, вы всегда можете использовать команду time.

Это довольно точно даже на суперкомпьютере. Время записывается в секундах до трех цифр точности (то есть: 1,034 с). Единственная проблема заключается в том, что это будет измерение всего времени выполнения приложения, вы не можете измерять только подпрограммы.

Пример использования:

time ./myApplication 

В противном случае вам придется написать класс таймера.

0

Если вы хотите просто время, повторите его 10^3 или 10^6 раз, как вы можете сказать, и отпустите его. (Я буквально использую свои часы.)

Если вы хотите узнать, что делает это медленным (совсем другая проблема), вы можете сделать лучше, чем gprof. Try this. If you're interested, here's a critique of gprof.

2

даже если это старый пост, я думал, я бы разместить код я нахожу весьма полезным для измерения времени выполнения процесса, так как это могло бы быть полезным для кого-то другого.

#include <sys/time.h> 
#include <sys/resource.h> 

typedef struct tag_time_measure 
{ 
    struct timeval startTimeVal; 
    struct timeval stopTimeVal; 

    struct rusage startTimeUsage; 
    struct rusage stopTimeUsage; 
} time_measure; 

time_measure * startTimeMeasuring() 
{ 
    time_measure * tu = malloc(sizeof(time_measure)); 
    if(!tu) 
    exit(1); 

    getrusage(RUSAGE_SELF, &tu->startTimeUsage); 
    gettimeofday(&tu->startTimeVal,0); 

    return tu; 
} 

void stopTimeMeasuring(time_measure * tu) 
{ 
    getrusage(RUSAGE_SELF, &tu->stopTimeUsage); 
    gettimeofday(&tu->stopTimeVal,0); 
} 

void printMeasuredTime(time_measure * tu) 
{ 
    struct timeval elapsedVal; 
    struct timeval userVal; 
    struct timeval systemVal; 

    double elapsed_millis = 0.0f; 
    double user_millis = 0.0f; 
    double system_millis = 0.0f; 

    timersub(&tu->stopTimeVal, &tu->startTimeVal, &elapsedVal); 
    timersub(&tu->stopTimeUsage.ru_utime, &tu->startTimeUsage.ru_utime, &userVal); 
    timersub(&tu->stopTimeUsage.ru_stime, &tu->startTimeUsage.ru_stime, &systemVal); 

    elapsed_millis = elapsedVal.tv_sec * 1000 + (double) elapsedVal.tv_usec/1000; 
    user_millis = userVal.tv_sec * 1000 + (double) userVal.tv_usec/1000; 
    system_millis = systemVal.tv_sec * 1000 + (double) systemVal.tv_usec/1000; 

    printf("\n\n---Program execution times in milliseconds--- \n"); 
    printf("Total:\t\t %f\nUser:\t\t %f\nSystem:\t\t %f\n", elapsed_millis, user_millis, system_millis); 
} 

Тогда можно было бы использовать такие функции, как:

int main(void) 
{ 
    time_measure * tu = startTimeMeasuring(); 

    doSomethingExpensiveHere(); 

    stopTimeMeasuring(tu); 

    printMeasuredTime(tu); 

    free(tu); 

    return EXIT_SUCCESS; 
} 

код может быть легко расширена, чтобы воспользоваться другими предложениями аккуратные вещи rusage (см http://www.gnu.org/s/libc/manual/html_node/Resource-Usage.html для более подробной информации). Надеюсь, кто-то найдет, что полезно :)

С уважением, Васил

+0

Обязательно добавьте приведение к '(time_measure *)' в начале этой 'malloc' в функции' startTimeMeasuring() ', если вы используете C++. – gbmhunter

Смежные вопросы