2013-08-29 2 views
-3

Мне нужно измерить время ввода и заканчивая мьютекс кода, так что я пишу это:Как измерить время в миллисекундах в С программе

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

pthread_t tid[4]; 
int counter; 
pthread_mutex_t lock; 

void* doSomeThing(void *arg) 
{ 
    pthread_mutex_lock(&lock); 

    time_t stime=time(NULL); 

    unsigned long i = 0; 
    counter += 1; 
    printf("\n Job %d started\n", counter); 

    for(i=0; i<(0xFFFF);i++){ 
//  printf("%d", i); //this is just wait 
    } 
    printf("\n Job %d finished\n", counter); 

    time_t etime=time(NULL); 
    printf("time : %ld\n", difftime(etime, stime)); 
    pthread_mutex_unlock(&lock); 
    return NULL; 
} 

int main(void) 
{ 
    int i = 0; 
    int err; 

    if (pthread_mutex_init(&lock, NULL) != 0) 
    { 
     printf("\n mutex init failed\n"); 
     return 1; 
    } 

    while(i < 4) 
    { 
     err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL); 
     if (err != 0) 
      printf("\ncan't create thread :[%s]", strerror(err)); 
     i++; 
    } 

    pthread_join(tid[0], NULL); 
    pthread_join(tid[1], NULL); 
    pthread_join(tid[2], NULL); 
    pthread_join(tid[3], NULL); 
    pthread_mutex_destroy(&lock); 

    return 0; 
} 

Но время я получаю 0

+1

Поскольку 'diffftime' возвращает' double', printf должен быть: 'printf (" time:% lf \ n ", difftime (etime, stime));' – nouney

+0

В зависимости от того, насколько вы оптимизировали свой код , '0' может быть правильным ответом на разрешение вашего таймера. – Floris

+1

Возможно, это связано с тем, что ваш код работает так быстро, что невозможно измерить разницу во времени. Попробуйте сделать что-то много времени в вашей петле for - сложная математика, например. – Trenin

ответ

2

Существует различные способы синхронизации вещи - «время стены», " CPU time "- два из них. Существуют различные библиотеки, которые помогут вам выполнять задачи синхронизации. Вот некоторые из них:

Для процессорного времени (если у вас есть несколько потоков на нескольких процессорах, то это будет «быстрее, чем настенные часы»):

#include <time.h> 
clock_t startTime, stopTime; 
double msecElapsed; 
startTime = clock(); 
// thing that needs timing 
stopTime = clock(); 
msecElapsed = (stopTime - startTime) * 1000.0/CLOCKS_PER_SEC; 

ПримечаниеЭтот может быть способен время с точностью до микросекунды - зависит от компилятора и платформы.

Для ИСТЕКШИХ (настенных часов) Время:

#include <sys/timeb.h> 

struct timeb start, stop; 
ftime(&start); 
// thing that needs timing 
ftime(&stop); 
msecElapsed = timeDifference(&start, &stop); 

Кроме того, необходима эта функция:

double timeDifference(struct timeb *start, struct timeb *stop) { 
    return stop->time - start->time + 0.001 * (stim->millitm - start->millitm); 
} 

Если вы используете OMP для облегчения параллельной обработки, она имеет удобную функцию

#include <omp.h> 
double startTime, stopTime; 
startTime = omp_get_wtime(); 
// do things 
stopTime = omp_get_wtime(); 

Это типично с точностью до микросекунды (даже если вы не использовали другие функции OMP).

Наконец, вы можете посмотреть ответы на вопросы this earlier question и this one для получения дополнительной информации/предложений.

1

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

Функция time() фактически возвращает секунды с 1 января 1970 года, а не миллисекунды. После быстрой Google, оказывается, что решение может быть в функции часов(), которая обеспечивает время до миллисекунды уровня (непроверенного):

#include <time.h> 

int main() 
{ 
    clock_t start, end; 

    start = clock(); 
    // do stuff 
    end = clock(); 

    std::cout << "Process took " << (1000 * double(end - start)/CLOCKS_PER_SEC) << "milliseconds." << '\n'; 
} 
+0

. Вы не работаете. –

+0

Разрешение, используемое 'clock()', является системной зависимостью и может быть определено в соответствии с запросом 'CLOCK_PER_SEC'. Поскольку последняя также является системной зависимостью, то использование обоих вместе - это измеренное время измерения. – alk

+0

@mezgani: Это не очень конструктивный (ошибка) отчет. – alk

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