Как использовать c time в linux для печати времени выполнения функции? - PullRequest
2 голосов
/ 23 ноября 2011

когда я запускаю код c в linux, код всегда не выводит время истечения, и результат всегда равен 0. Код выглядит следующим образом:

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void main(int argc,char* argv[]){
  int n;
  if(argc == 2){
    n = atoi(argv[1]);
  }
  struct timeval start, end;
  gettimeofday(&start, 0);
  int r = fib(n);
  gettimeofday(&end, 0);
  long mtime, s,us;
  s = end.tv_sec  - start.tv_sec;
  us = end.tv_usec - start.tv_usec;
  printf("s=%f,us=%f  \n", s, us);
  mtime = (s*1000 + us/1000.0)+0.5;
  printf("Fib result for %d is: %d;elapsing %f \n", n, r, mtime); 

}

int fib(int n){
  if(n == 0) return 0;
  if(n == 1) return 1;
  return fib(n-1)+fib(n-2);
}

Ответы [ 5 ]

6 голосов
/ 23 ноября 2011

Все предложения действительно работают, но степень детализации измерения времени велика (обычно от 10 до 100 миллисекунд). Таким образом, он фактически измеряет что-то для вычисления, которое продолжается, например, полсекунды На современных процессорах (работающих от 2 до 3 ГГц, с 3-5 командами на такт) это означает что-то вроде миллиарда машинных инструкций («элементарный шаг» в нашей C-программе - с плохо определенным понятием шага десяток машинных инструкций). Таким образом, ваш тест слишком мал, вам действительно нужно вычислить фибионакцию в миллион раз (10).

Чтобы быть более точным, приведенная ниже программа (где выводятся некоторые вычисления, чтобы не оптимизировать их все) выполняется примерно за 2 секунды. (на миллион вычислений fibionacci, что меньше 16).

#include <stdio.h>
#include <unistd.h>
#include <time.h>
long fib(int n){
  if(n == 0) return 0;
  if(n == 1) return 1;
  return fib(n-1)+fib(n-2);
}

int main ()
{
  int i=0;
  int p = (int) getpid();
  clock_t cstart = clock();
  clock_t cend = 0;
  for (i=0; i<1000000; i++) {
    long f = fib(i%16);
    if (i % p == 0) printf("i=%d, f=%ld\n", i, f);
  }
  cend = clock();
  printf ("%.3f cpu sec\n", ((double)cend - (double)cstart)* 1.0e-6);
  return 0;
}   

Последние несколько строк выводятся с time ./fib (скомпилировано с gcc -O2 -Wall fib.c -o fib) есть

i=936079, f=610
i=948902, f=8
i=961725, f=233
i=974548, f=3
i=987371, f=89
2.140 cpu sec
./fib  2.15s user 0.00s system 99% cpu 2.152 total

бенчмаркинг бега менее чем за секунду не имеет особого смысла

(и вы можете использовать команду time для измерения такого прогона)

См. Также время (7) и clock_gettime (2) .

6 голосов
/ 23 ноября 2011

Не пропустите предупреждения вашего компилятора; Вы пытаетесь напечатать три long переменные (mtime, s и us), как если бы они были double s:

fib.c: In function ‘main’:
fib.c:17:3: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘long int’
fib.c:17:3: warning: format ‘%f’ expects type ‘double’, but argument 3 has type ‘long int’
fib.c:19:3: warning: format ‘%f’ expects type ‘double’, but argument 4 has type ‘long int’

Измените s и us на long и измените формат для s и us на %ld, и программа скомпилируется (и запустится) без ошибок.

2 голосов
/ 23 ноября 2011

Возможно, будет проще использовать функцию clock:

clock_t start = clock();
int r = fib(n);
clock_t end = clock();
printf("Elapsed time: %.2f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
1 голос
/ 23 ноября 2011

Разрешение часов реального времени, вероятно, не очень мало (возможно, 10 или 25 миллисекунд), и ваши вычисления слишком короткие, чтобы быть значительными. Вы можете поместить свои вычисления в цикл (например, повторить его несколько тысяч раз).

Вы также можете измерить время процессора, используя функцию clock .

Вы также можете использовать функцию clock_gettime , чтобы получить, возможно, лучшие результаты.

И, как говорили другие люди, пожалуйста, попросите все предупреждения с помощью gcc -Wall и примите их во внимание. Если вам не безразлична производительность (но помните, что преждевременная оптимизация - это зло , так что сначала исправьте вашу программу!) Подумайте о включении оптимизации (например, gcc -Wall -O2) во время компиляции.

0 голосов
/ 23 ноября 2011

Это должно дать вам истекшее время:

#include <iostream>
#include <sys/time.h> /* gettimeofday */

int main() {
    /* get begin time */
    timeval begin;
    ::gettimeofday(&begin, 0);
    /* do something... */
    ::usleep(153);
    /* get end time */
    ::timeval current;
    ::gettimeofday(&current, (struct timezone*) 0);
    /* calculate difference */
    double elapsed = (current.tv_sec - begin.tv_sec) + ((current.tv_usec
            - begin.tv_usec) / 1000000.0F);
    /* print it */
    std::cout << elapsed << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...