Прошедшее время запущения программы C

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

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

Обновление у меня есть Победа машина 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 ошибкам. Обратите внимание, что у меня нет ошибок/предупреждений без Ваших кодов часов.

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

#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.

8
задан yCalleecharan 10 April 2010 в 08:47
поделиться

6 ответов

Если вы работаете в Windows и хотите измерить количество микросекунд, изучите QueryPerformanceCounter () и QueryPerformanceFrequency (). Во многих системах они могут разрешать полные периоды тактовой частоты процессора, треть нано секунды, и я не думаю, что когда-либо видел его более грубым, чем 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
ответ дан 5 December 2019 в 12:09
поделиться

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

0
ответ дан 5 December 2019 в 12:09
поделиться

Вы можете использовать функцию clock () ), если вы хотите протестировать блок кода, или 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. Вы не должны вызывать какие-либо функции, а затем продолжать объявлять переменные. Объявите все свои вары вверху или скомпилируйте в режиме C ++.

3
ответ дан 5 December 2019 в 12:09
поделиться

Вам, вероятно, понадобится time.h и функция clock () .

1
ответ дан 5 December 2019 в 12:09
поделиться

Если вам нужна общая сумма для вашей программы, тогда в консоли 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
ответ дан 5 December 2019 в 12:09
поделиться

В системах 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 () . Таким образом, будет более ясно, каков код времени и какова остальная часть программы.

6
ответ дан 5 December 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: