Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的c++;基于clock()的函数是否返回负值? 我仍然是C++的新的,时钟函数是绝对的(意味着计算你睡多长时间),或者是应用程序实际执行了多少时间?< /P>_C++_Timing_Clock - Fatal编程技术网

为什么我的c++;基于clock()的函数是否返回负值? 我仍然是C++的新的,时钟函数是绝对的(意味着计算你睡多长时间),或者是应用程序实际执行了多少时间?< /P>

为什么我的c++;基于clock()的函数是否返回负值? 我仍然是C++的新的,时钟函数是绝对的(意味着计算你睡多长时间),或者是应用程序实际执行了多少时间?< /P>,c++,timing,clock,C++,Timing,Clock,我想要一种可靠的方法来产生精确的1秒间隔。我正在保存文件,所以我需要对此进行说明。我以毫秒为单位返回运行时,然后为剩余时间休眠 有没有更准确或更简单的方法 编辑: 我遇到的主要问题是我得到了一个负数: double FCamera::getRuntime(clock_t* end, clock_t* start) { return((double(end - start)/CLOCKS_PER_SEC)*1000); } clock_t start = clock(); doWork

我想要一种可靠的方法来产生精确的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);
它给了我一个负数,怎么了

Walter

返回自程序启动以来经过的时钟滴答数。如果要将时钟返回的值转换为秒,请除以
CLOCKS\u PER\u SEC
(另一种方法是相乘)

这里只有一个陷阱,时钟用作程序执行开始的初始参考时刻在不同平台之间可能有所不同。要计算程序的实际处理时间,应将时钟返回的值与对时钟的初始调用返回的值进行比较

编辑

拉斯曼在评论中还提到了其他的陷阱,这真是太好了。我把它们放在这里以备将来参考

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

  • 请注意,时间可以循环。在32位系统上,每秒时钟数等于1000000[按照POSIX的规定],此函数将大约每72分钟返回相同的值

  • EDIT2

    在闲逛了一会儿之后,这是我的便携式(Linux/Windows)msleep。不过要小心,我对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
    
    \ifdef\u WIN32
    #包括
    #定义msleep(毫秒)睡眠((DWORD)毫秒)
    #否则
    #包括
    内联无效msleep(无符号长ms){
    而(ms--)usleep(1000);
    }
    #恩迪夫
    
    在windows下,您可以使用:

    VOID WINAPI Sleep(
      __in  DWORD dwMilliseconds
    );
    
    在linux中,您需要使用:

    #include <unistd.h>
    unsigned int sleep(unsigned int seconds);
    
    #包括
    无符号整数睡眠(无符号整数秒);
    

    请注意参数差异—windows下的毫秒和linux下的秒。

    我的方法依赖于:

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

    它给出了自历元以来的秒数和微秒数。根据手册页:

    你错过了*(指针), 您的参数是指针(时钟变量的地址) 因此,必须修改您的代码::

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

    关于
    clock
    函数,您是对的,但是您的代码实现延迟的效率相当低——它什么都不做,浪费了CPU周期。为什么不使用内置的
    sleep
    调用呢?还有一个陷阱:“在其他几种实现中,
    clock()
    返回的值还包括通过
    wait(2)
    (或另一种等待类型调用)收集其状态的任何子级的时间.Linux在
    clock()
    ”返回的值中不包括等待子项的时间,还有一个:“请注意,时间可以循环。在32位系统上,
    CLOCKS\u PER\u SEC
    等于1000000[按照POSIX的规定],此函数将大约每72分钟返回相同的值。”但由于您的进程会休眠一秒钟,这不太可能成为问题:)他不能使用睡眠,因为他需要在开始写入文件之前启动计时器。所以我会使用clock();或者timeGetTime()(这是一个Windows函数,启动后会有毫秒,每49天包装一次)这个差异被称为“墙时间”和“CPU时间”。我想我刚刚算出了,我想我是在传递地址并做地址算术。我算出了,我是在解引用并减去地址。
    #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
    
    return((double(*end - *start)/CLOCKS_PER_SEC)*1000);