2015-05-31 3 views
2

Мне нужно скрыть инструкции, чтобы получить прошедшее время в C. Например, в следующем коде есть несколько линейных инструкций, чтобы получить истекшее время функции foo.Скрытие получения прошедшего времени в C

struct timeval start_keygen, end_keygen; 
long int diff_keygen_sec = 0; 
gettimeofday(&start_keygen, NULL); 
foo(r, w, h); 
gettimeofday(&end_keygen, NULL); 
timediff(start_keygen, end_keygen, &diff_keygen_sec); 

Мой вопрос Как скрыть, что несколько строк в одной функции, например, в "GetTime", то есть:

getTime(foo(r,w,h)) 
+1

хотя некрасиво, как о макросе? –

+0

@ м.с. Это не уродливо! –

ответ

5

Вы можете использовать макрос:

#define TIME(e, res) do{struct timeval start_keygen, end_keygen; \ 
      res = 0; \ 
      gettimeofday(&start_keygen, NULL); \ 
      e; \ 
      gettimeofday(&end_keygen, NULL); \ 
      timediff(start_keygen, end_keygen, &res)} while(0) \ 

Тогда вы можете сделать:

long int myRes; 
TIME(foo(r,w,h), myRes); 

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

+0

@iharob, спасибо, отредактировано. – Matt

2

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

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

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

#define TimedExecution(elapsed, function, ...)    \ 
    do {              \ 
     struct timeval start;        \ 
     struct timeval end;         \ 
     gettimeofday(&start, NULL);       \ 
     function(__VA_ARGS__);        \ 
     gettimeofday(&end, NULL);       \ 
     *((long int *) elapsed) = timevaldiff(&start, &end); \ 
    } while (0) 

long int 
timevaldiff(struct timeval *starttime, struct timeval *finishtime) 
{ 
    long int msec; 

    msec = (finishtime->tv_sec - starttime->tv_sec) * 1000; 
    msec += (finishtime->tv_usec - starttime->tv_usec)/1000; 

    return msec; 
} 

void 
execute(const char *message) 
{ 
    for (int i = 0 ; i < 3 ; ++i) 
    { 
     fprintf(stdout, "%s\n", message); 
     sleep(1); 
    } 
} 

int 
main(void) 
{ 
    long int elapsed; 
    TimedExecution(&elapsed, execute, "Hello World!"); 
    fprintf(stdout, "Executed in: %ld msec\n", elapsed); 
    return 0; 
} 
Смежные вопросы