2013-07-03 3 views
1

Я хочу измерить время настенных часов с clock_gettime, но каждый раз, когда я запускаю свой код, он показывает 0. Почему? (я хочу, чтобы мой результат, чтобы быть в миллисекундах.)clock_gettime всегда показывает 0

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 

int main(int argc, char **argv) 
    { 
    struct timespec start, stop; 
    unsigned long accum; 

    if(clock_gettime(CLOCK_REALTIME, &start) == -1) { 
     perror("clock gettime"); 
     exit(EXIT_FAILURE); 
    } 

    int i; 
    for(i=0; i<100000000; i++){int a = 3; int b = 100; int c = a*b;} 

    //system(argv[1]); 

    if(clock_gettime(CLOCK_REALTIME, &stop) == -1) { 
     perror("clock gettime"); 
     exit(EXIT_FAILURE); 
    } 

    accum = (unsigned long)((stop.tv_sec - start.tv_sec) * 1000) + (unsigned long)((stop.tv_nsec - start.tv_nsec)/1000000) +0.5; 
    printf("%lu\n", accum); 
    return(EXIT_SUCCESS); 
    } 
+1

http://en.wikipedia.org/wiki/Dead_code_elimination - компилятор полностью удаляет ваш цикл. – Mysticial

+0

То, как вы вычисляете 'accum', вы увидите ненулевое значение, только если выполнение занимает не менее 1 секунды. И цикл 'for', скорее всего, оптимизирован. Замените цикл на «scanf», чтобы увеличить задержку. – Inspired

+0

@Mysticial: Хорошо, спасибо! :)) Вопрос о miliseconds: Я хотел бы знать, если 'accum = (unsigned long) ((stop.tv_sec - start.tv_sec) * 1000) + (unsigned long) ((stop. tv_nsec - start.tv_nsec)/1000000) +0,5; 'даст мне миллисекунды? –

ответ

2

Поскольку компилятор оптимизирует вашу сторону петли. Сделайте что-то внутри цикла, которое не может быть легко упрощено (компилятором); поэтому создайте некоторый результат. Затем используйте (например, распечатать) этот результат после цикла.

Вы также можете попытаться отключить оптимизацию (ы) при компиляции. Но поскольку ваш текущий цикл очень легко оптимизировать, это может не повлиять.

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