Я хотел бы знать то, что строки 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.
Если вы работаете в 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
Вы также можете попробовать GetTickCount . Часы тоже будут работать нормально. Но я предполагаю, что значения часов изменятся, если какой-то другой процесс или кто-то вручную изменит системное время, хотя на значения GetTickCount это не влияет.
Вы можете использовать функцию 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 ++.
Вам, вероятно, понадобится time.h и функция clock ()
.
Если вам нужна общая сумма для вашей программы, тогда в консоли 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 );
}
В системах 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 ()
. Таким образом, будет более ясно, каков код времени и какова остальная часть программы.