我想测试一个函数:function()
我不知道如何在C中执行此操作,这是我想要做的伪代码:
int main()
{
int startTime = getTime();
function();
int endTime = getTime();
print endTime - startTime;
}
这是如何在C中完成的?
答案 0 :(得分:3)
不幸的是,使用ANSI C无法做到这一点。但是,你可以使用POSIX函数gettimeofday
来做到这一点:
#include <sys/time.h>
struct timeval tv;
struct timeval start_tv;
gettimeofday(&start_tv, NULL);
// call your function here
double elapsed = 0.0;
gettimeofday(&tv, NULL);
elapsed = (tv.tv_sec - start_tv.tv_sec) +
(tv.tv_usec - start_tv.tv_usec) / 1000000.0;
或者,如果您想要整个程序的执行时间,也可以在命令行上运行time ./your_program
。
最后,如果您使用的是Windows,则可以使用timeGetTime
功能。
答案 1 :(得分:1)
此代码运行function()
100万次,然后打印每个函数调用的平均运行时间。
#include <time.h>
#include <stdlib.h>
int main(int argc, const char ** argv)
{
time_t start, end;
start = time(NULL);
for (int i = 0; i < 1000000; ++i)
function();
end = time(NULL);
printf("%f\n", (end - start) / 1000000.0);
return 0;
}
答案 2 :(得分:0)
查看gettimeofday
和/或clock
函数。可能有更多高精度时钟/定时器,但这些应该足以获得良好的代码横截面。
答案 3 :(得分:0)
我总是使用这个类(抱歉,它是C ++)我很久以前就找到了。对不起,我不认识作者,但我想发布它是可以的。
用法:
Timer hello;
hello.start();
function();
hello.stop();
std::cout << "Total time in ms: " << hola.getElapsedTimeInMilliSec() << std::endl;
班级本身:
#include "timer.hh"
#include <stdlib.h>
///////////////////////////////////////////////////////////////////////////////
// constructor
///////////////////////////////////////////////////////////////////////////////
Timer::Timer()
{
#ifdef WIN32
QueryPerformanceFrequency(&frequency);
startCount.QuadPart = 0;
endCount.QuadPart = 0;
#else
startCount.tv_sec = startCount.tv_usec = 0;
endCount.tv_sec = endCount.tv_usec = 0;
#endif
stopped = 0;
startTimeInMicroSec = 0;
endTimeInMicroSec = 0;
}
///////////////////////////////////////////////////////////////////////////////
// distructor
///////////////////////////////////////////////////////////////////////////////
Timer::~Timer()
{
}
///////////////////////////////////////////////////////////////////////////////
// start timer.
// startCount will be set at this point.
///////////////////////////////////////////////////////////////////////////////
void Timer::start()
{
stopped = 0; // reset stop flag
#ifdef WIN32
QueryPerformanceCounter(&startCount);
#else
gettimeofday(&startCount, NULL);
#endif
}
///////////////////////////////////////////////////////////////////////////////
// stop the timer.
// endCount will be set at this point.
///////////////////////////////////////////////////////////////////////////////
void Timer::stop()
{
stopped = 1; // set timer stopped flag
#ifdef WIN32
QueryPerformanceCounter(&endCount);
#else
gettimeofday(&endCount, NULL);
#endif
}
///////////////////////////////////////////////////////////////////////////////
// compute elapsed time in micro-second resolution.
// other getElapsedTime will call this first, then convert to correspond resolution.
///////////////////////////////////////////////////////////////////////////////
double Timer::getElapsedTimeInMicroSec()
{
#ifdef WIN32
if(!stopped)
QueryPerformanceCounter(&endCount);
startTimeInMicroSec = startCount.QuadPart * (1000000.0 / frequency.QuadPart);
endTimeInMicroSec = endCount.QuadPart * (1000000.0 / frequency.QuadPart);
#else
if(!stopped)
gettimeofday(&endCount, NULL);
startTimeInMicroSec = (startCount.tv_sec * 1000000.0) + startCount.tv_usec;
endTimeInMicroSec = (endCount.tv_sec * 1000000.0) + endCount.tv_usec;
#endif
return endTimeInMicroSec - startTimeInMicroSec;
}
///////////////////////////////////////////////////////////////////////////////
// divide elapsedTimeInMicroSec by 1000
///////////////////////////////////////////////////////////////////////////////
double Timer::getElapsedTimeInMilliSec()
{
return this->getElapsedTimeInMicroSec() * 0.001;
}
///////////////////////////////////////////////////////////////////////////////
// divide elapsedTimeInMicroSec by 1000000
///////////////////////////////////////////////////////////////////////////////
double Timer::getElapsedTimeInSec()
{
return this->getElapsedTimeInMicroSec() * 0.000001;
}
///////////////////////////////////////////////////////////////////////////////
// same as getElapsedTimeInSec()
///////////////////////////////////////////////////////////////////////////////
double Timer::getElapsedTime()
{
return this->getElapsedTimeInSec();
}
答案 4 :(得分:0)
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start, finish;
start = clock();
....
finish = clock();
printf("Time: %d", ((double) (finish - start)) / CLOCKS_PER_SEC);
return 0;
}
clock()获取自进程开始以来的时钟周期数。因此,从完成开始减去开始并除以CLOCKS_PER_SEC应该可以在几秒钟内为您提供运行时间。 (有关详细信息,请参阅the manual。
答案 5 :(得分:0)
查看GetTickCount windows api和About Timers(适用于Windows)