2

我想测试一个函数的时间:function()

我不知道如何在 C 中做到这一点,这是我想要做的伪代码:

int main()
{
int startTime = getTime();
function();
int endTime = getTime();
print endTime - startTime;
}

这是如何在 C 中完成的?

4

6 回答 6

3

不幸的是,使用 ANSI C 无法做到这一点。但是,您可以使用gettimeofdayPOSIX 函数来做到这一点:

#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功能。

于 2012-07-05T16:36:16.533 回答
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;
}
于 2012-07-05T16:36:11.930 回答
0

查看gettimeofday和/或clock函数。可能有更多的高精度时钟/定时器,但对于良好的代码横截面来说,这些应该足够了。

于 2012-07-05T16:35:44.633 回答
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();
}
于 2012-07-05T16:36:58.563 回答
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 应该会给你以秒为单位的运行时间。(有关更多信息,请参阅手册

于 2012-07-05T17:03:22.297 回答
0

查看GetTickCount windows api 和About Timers (for Windows)

于 2012-07-05T17:24:01.423 回答