clock() and CLOCKS_PER_SEC on OSX 10.7

clock() and CLOCKS_PER_SEC on OSX 10.7

本文关键字:on OSX SEC PER and CLOCKS clock      更新时间:2023-10-16

我在OSX中使用clock()有问题。我只想显示自程序启动以来经过的时间。问题是,当我把clock_t结构除以CLOCKS_PER_SEC时,我得到了奇怪的结果。

运行我的程序10秒将显示1.0。在我的系统上,CLOCKS_PER_SEC设置为1,000,000。

下面是我的代码示例:

    //startTime = clock() at the start of the program
    //This is called in each program loop       
    elapsedTime = (double)(clock() - startTime)/CLOCKS_PER_SEC

如果我做elapsedTime * 10,我得到准确的值在秒。在程序执行过程中,我不做任何睡眠或等待。

如果你能帮助我理解发生了什么,我将非常感激。

编辑:

好吧,我纠正了转换,但它并没有改变这样一个事实,即如果我运行程序10秒,我得到1.0,1秒是0.1。这就是我不明白的地方。我的CLOCKS_PER_SEC就像一个CLOCKS_PER_TEN_SEC

我认为你的转换是在错误的地方,所以你得到一个整数除法。试试这个:

elapsedTime = (double)(clock() - startTime)/CLOCKS_PER_SEC;
编辑:

还要注意,在大多数系统上,clock()测量CPU时间。也许你并没有像你想象的那样使用那么多CPU时间。

将类型转换移到第一个括号内:

 elapsedTime = ((double)(clock() - startTime)/CLOCKS_PER_SEC)

现在clock() -startTime变成了double,强制CLOCKS_PER_SEC也是一个浮点值,你得到的结果是浮点值。否则,这是一个整数除法,你只能得到整数结果。

clock() with CLOCKS_PER_SEC不适合在Mac OS x上使用。clock()返回以tick为单位的处理器时间,而POSIX规定CLOCKS_PER_SEC为1000000,如man clock页面所述。

在我遇到这种情况的情况下,像你一样,计算误差是十倍。因此,clock()以每秒100000个时钟的速度运行。在Windows上,我每秒看到1000个时钟。但是如果您对此进行检查,实际的分辨率和精度可能比这差得多,因此clock()通常不是一个好的解决方案。对于Mac OS X, gettimeofday是一个更好的解决方案。我也认为std::chrono是一个很好的解决方案,应该是一个更好的跨平台选择,但我还没有尝试。