为什么我的基于c ++ clock()的函数返回负值?

时间:2011-01-20 15:29:09

标签: c++ timing clock

我还是C ++的新手,是绝对的时钟函数(意味着它会计算你的睡眠时间),还是应用程序实际执行的时间?

我想要一种可靠的方法来产生1秒的精确间隔。我正在保存文件,所以我需要考虑到这一点。我以毫秒为单位返回运行时间,然后休眠。

有更准确或更简单的方法吗?

编辑: 我遇到的主要问题是我得到一个负数:

double FCamera::getRuntime(clock_t* end, clock_t* start)
{
    return((double(end - start)/CLOCKS_PER_SEC)*1000);
}


clock_t start = clock();
doWork();
clock_t end = clock();

double runtimeInMilliseconds = getRuntime(&end, &start);

它给了我一个负数,这是怎么回事?

沃尔特

4 个答案:

答案 0 :(得分:3)

clock()返回自程序启动以来经过的时钟周期数。如果你想将时钟返回的值转换为秒除以CLOCKS_PER_SEC(并且相反地相乘)。

只有一个缺陷,即时钟使用的初始参考时刻,因为程序执行的开始可能因平台而异。要计算程序的实际处理时间,应将时钟返回的值与初始调用时钟返回的值进行比较。

修改

larsman非常友好地发表评论中的其他陷阱。我把它们包括在这里供将来参考。

  1. 在其他几个实现中,clock()返回的值还包括通过wait(2)(或其他等待类型调用)收集状态的任何子项的时间。 Linux不包括clock()返回的值中等待子项的次数。

  2. 请注意,时间可以环绕。在CLOCKS_PER_SEC等于1000000的32位系统上[按照POSIX的要求],此函数大约每72分钟返回相同的值。

  3. <强> EDIT2

    在这里弄乱了一段时间后,我的便携式(Linux / Windows)会出现问题。但要小心,我对C / C ++没有经验,并且很可能包含有史以来最愚蠢的错误。

    #ifdef _WIN32
    
    #include <windows.h>
    #define msleep(ms) Sleep((DWORD) ms)
    
    #else
    
    #include <unistd.h>
    inline void msleep(unsigned long ms) {
        while (ms--) usleep(1000);
    }
    
    #endif
    

答案 1 :(得分:1)

你错过了*(指针), 你的参数是指针(clock_t变量的地址) 所以,您的代码必须修改::

return((double(*end - *start)/CLOCKS_PER_SEC)*1000);

答案 2 :(得分:0)

在Windows下,您可以使用:

VOID WINAPI Sleep(
  __in  DWORD dwMilliseconds
);

在linux中,您将需要使用:

#include <unistd.h>
unsigned int sleep(unsigned int seconds);

注意参数差异 - 在linux下的windows和秒下的毫秒数。

答案 3 :(得分:0)

我的方法依赖于:

int gettimeofday(struct timeval *tv, struct timezone *tz);

给出了自纪元以来的秒数和微秒数。根据 man 页面:

The tv argument is a struct timeval (as specified in <sys/time.h>):

           struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
           };

所以我们走了:

#include <sys/time.h>

#include <iostream>
#include <iomanip>

static long myclock()
{
    struct timeval tv; 
    gettimeofday(&tv, NULL);
    return (tv.tv_sec * 1000000) + tv.tv_usec;
}

double getRuntime(long* end, long* start)
{
    return (*end - *start);
}

void doWork()
{
    sleep(3);
}

int main(void)
{
    long start = myclock();
    doWork();
    long end = myclock();

    std::cout << "Time elapsed: " << std::setprecision(6) << getRuntime(&end, &start)/1000.0 << " miliseconds" << std::endl;
    std::cout << "Time elapsed: " << std::setprecision(3) << getRuntime(&end, &start)/1000000.0 << " seconds" << std::endl;

    return 0;
}

输出:

Time elapsed: 3000.08 miliseconds
Time elapsed: 3 seconds