Истекшее время выполнения программы на C - PullRequest
8 голосов
/ 07 апреля 2010

Я хотел бы знать, какие строки кода C нужно добавить в программу, чтобы она сообщала мне общее время, необходимое программе для запуска. Я предполагаю, что должна быть инициализация счетчика в начале основной и одна после основной функции заканчивается. Правильный ли заголовок clock.h?

Большое спасибо ...

Обновление У меня машина Win Xp. Это просто добавление clock() в начале и еще одного clock() в конце программы? Тогда я могу оценить разницу во времени. Да, вы правы, это time.h.

Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <share.h>
#include <time.h>


void f(long double fb[], long double fA, long double fB);

int main() {

clock_t start, end;
start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A, B;

if (z == NULL) {
    printf("Out of memory\n");
    exit(-1);
}

A = 0.5;
B = 2;


for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
}

z[1] = 5;

f(z, A, B);

for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

end = clock();
printf("Took %ld ticks\n", end-start);
printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);



return 0;  
}  

void f(long double fb[], long double fA, long double fB) {
    fb[0] = fb[1]* fA;
    fb[1] = fb[1] - 1;
    return;
 }  

Некоторые ошибки с MVS2008:

testim.c(16) : error C2143: syntax error : missing ';' before 'const'  
testim.c(18) :error C2143: syntax error : missing ';' before 'type'  
testim.c(20) :error C2143: syntax error : missing ';' before 'type'   
testim.c(21) :error C2143: syntax error : missing ';' before 'type'    
testim.c(23) :error C2065: 'z' : undeclared identifier   
testim.c(23) :warning C4047: '==' : 'int' differs in levels of indirection from 'void *'  
testim.c(28) : error C2065: 'A' : undeclared identifier
testim.c(28) : warning C4244: '=' : conversion from 'double' to 'int', possible loss of data   

и доходит до 28 ошибок. Обратите внимание, что у меня нет никаких ошибок / предупреждений без ваших часовых кодов.

ПОСЛЕДНИЕ НОВОСТИ: Я, к сожалению, не получил хорошего ответа здесь. Но после поиска в гугле код работает. Вот оно:

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


void f(long double fb[], long double fA);

int main() {

clock_t start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A;

if (z == NULL) {
printf("Out of memory\n");
exit(-1);
}

A = 0.5;


for (i = 0; i < ARRAY_SIZE; i++) {
z[i] = 0;
}

z[1] = 5;

f(z, A);

for (i = 0; i < ARRAY_SIZE; i++)
printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

printf("Took %f seconds\n", ((double)clock()-start)/CLOCKS_PER_SEC);



return 0;
}

void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

Приветствия

Обновление от 10 апреля: вот лучшее решение благодаря JustJeff

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

void f(long double fb[], long double fA);

const int ARRAY_SIZE = 11;

int main(void)
{

   long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
   int i;
   long double A;

   LARGE_INTEGER freq;
   LARGE_INTEGER t0, tF, tDiff;
   double elapsedTime;
   double resolution;

   if (z == NULL) {
   printf("Out of memory\n");
   exit(-1);
   }
   QueryPerformanceFrequency(&freq);
   QueryPerformanceCounter(&t0);
   // code to be timed goes HERE
   {
    A = 0.5;


    for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
    }

    z[1] = 5;
    f(z, A);


    for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);

    free(z);
    z = NULL;

   }
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
resolution = 1.0 / (double) freq.QuadPart;
printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
printf("Resolution is %lf nanoseconds\n", resolution*1e9);
printf("Code under test took %lf sec\n", elapsedTime);
return 0;
}


void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

Работает как с MVS2008, так и с Borland C ++ builderX с 2003 года.

Ответы [ 6 ]

6 голосов
/ 07 апреля 2010

В системах Unix (я думаю), команда time с именем вашей программы в качестве аргумента командной строки подскажет вам время, необходимое программе для запуска.Обратите внимание, что это измеряет время выполнения всей программы.Если вам нужно протестировать только одну часть, включите time.h и используйте функцию часов, примерно так:

#include <time.h>

int main() {
    clock_t start;
    clock_t end;
    int function_time;
    start = clock();
    function_you_want_to_time();
    end = clock();
    /* Get time in milliseconds */
    function_time = (double)(end - start) / (CLOCKS_PER_SEC / 1000.0);
    return 0;
}

Это даст вам время в миллисекундах (обратите внимание на часть / 1000.0),Если вам нужны секунды, удалите / 1000.0.Если вам нужны простые такты, которые будут более точными, сделайте function_time a clock_t и замените строку function_time = ... на:

function_time = end - start;

Чтобы рассчитать время всей программы, я предлагаю сделатьвызвав функцию _main() или что-то в этом роде, переместите весь код, связанный с вашей программой, из main() (не код синхронизации!) в эту функцию и вызовите ее из main().Таким образом, становится более понятным, каков временный код и какова остальная часть программы.

3 голосов
/ 07 апреля 2010

Если вам нужно общее количество для вашей программы, то в консоли Linux:

$ time myProgram

Вы также можете использовать time.h в своем коде.

#include <time.h>

int main(){
  time_t start, end;
  start = time(0);

  /* some working code */

  end = time(0);
  printf("%i seconds", end - start );
}
3 голосов
/ 07 апреля 2010

Вы можете использовать функцию clock()<time.h>), если хотите протестировать блок кода, или программу time в * nix, как предложил другой ответчик. Э.Г.

> time ./foo my args

Для часов вам нужно вычесть разницу между двумя контрольными точками. Э.Г.

#include <time.h>

void f() {
  clock_t start, end;

  start = clock();

  // some long code.

  end = clock();
  printf("Took %ld ticks\n", end-start);
  // or in (fractional) seconds.
  printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);
}

Обновление

Что касается ваших новых ошибок, вы не можете смешивать код и объявления в VC. Вы не должны вызывать какие-либо функции, а затем продолжать объявлять переменные. Объявите все ваши vars вверху или скомпилируйте в режиме C ++.

1 голос
/ 08 апреля 2010

Если вы работаете в Windows и хотите измерить вещи в микросекундах, исследуйте QueryPerformanceCounter () и QueryPerformanceFrequency (). Во многих системах они могут разрешать полные такты процессора, треть от nano секунды, и я не думаю, что когда-либо видел его более грубым, чем 3,5795 МГц, все еще с точностью до микросекунды.

Вы вызываете QueryPerformanceFrequency (), чтобы определить, сколько счетчиков в секунду считает счетчик. Затем вызовите QueryPerformanceCounter () перед тестируемым кодом, а затем снова после. Дельта двух показаний QPC и разделить на период от QPF, и вы получите истекшее время между двумя вызовами QPC. Вот так ...

LARGE_INTEGER freq;
LARGE_INTEGER t0, tF, tDiff;
double elapsedTime;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
// code to be timed goes HERE
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
// elapsedTime now has your measurement, w/resolution given by freq

Очевидно, что они обращаются к устройству подсчета оборудования, которое связано с каким-либо системным генератором на основной плате, и в этом случае они не должны испытывать дрожание от загрузки программного обеспечения. Разрешение, которое вы получите, зависит от вашей системы.

СЛЕДОВАТЬ ВВЕРХ

Вот очень простая и полная программа, демонстрирующая интерфейс:

#include <windows.h>
int main(void)
{
    LARGE_INTEGER freq;
    LARGE_INTEGER t0, tF, tDiff;
    double elapsedTime;
    double resolution;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&t0);
    // code to be timed goes HERE
    {
        Sleep(10);
    }
    QueryPerformanceCounter(&tF);
    tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
    elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
    resolution = 1.0 / (double) freq.QuadPart;
    printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
    printf("Resolution is %lf nanoseconds\n", resolution*1e9);
    printf("Code under test took %lf sec\n", elapsedTime);
    return 0;
}

Для чего-то такого простого: IDE быстрее пропустить, просто сохраните его в файле foo.c и (при условии MS VS 2008) используйте командную строку

cl foo.c

чтобы построить его. Вот вывод на моей системе:

Your performance counter ticks 3579545 times per second
Resolution is 279.365115 nanoseconds
Code under test took 0.012519 sec
1 голос
/ 07 апреля 2010

Возможно, вам нужен time.h и функция clock().

0 голосов
/ 07 апреля 2010

Вы также можете попробовать GetTickCount .Часы тоже будут работать нормально.Но, я думаю, значения часов изменятся, если какой-то другой процесс или кто-то другой вручную изменят системное время, тогда значения GetTickCount не будут затронуты.

...