首页 文章

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

提问于
浏览
2

我还是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

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

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

    EDIT

    拉斯曼非常善意在评论中发表其他陷阱 . 我把它们包括在这里供将来参考 .

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

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

    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

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

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

    在Windows下,您可以使用:

    VOID WINAPI Sleep(
      __in  DWORD dwMilliseconds
    );
    

    在linux中,您将要使用:

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

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

  • 0

    我的方法依赖于:

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

    它给出了自大纪元以来的秒数和微秒数 . 根据手册页:

    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
    

相关问题