首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

在linux下clock()函数始终返回0?该如何解决

2012-02-16 
在linux下clock()函数始终返回0???看看这段代码:#includestdio.h#includetime.hintmain(){clock_tnow,

在linux下clock()函数始终返回0???
看看这段代码:

#include   <stdio.h>
#include   <time.h>

int   main()
{
                clock_t   now,start_time   =   clock();
                do
                {
                                printf(   "wait...\n "   );
                                sleep(   1   );
                                now   =   clock();
                                printf(   "%d-%d=%d\n ",   now,   start_time,   (now     -   start_time)   /   CLOCKS_PER_SEC   );
                }
                while(   clock()   -   start_time   <   CLOCKS_PER_SEC   *   10   );

                return   0;
}

结果:
wait...
0-0=0
wait...
0-0=0
wait...
0-0=0
wait...
0-0=0
wait...
0-0=0




[解决办法]
精度不够
[解决办法]
C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void elapsed_time()
{
printf( "Elapsed time:%u secs.\n ",clock()/CLOCKS_PER_SEC);
}

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

#include “stdio.h”
#include “stdlib.h”
#include “time.h”

int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- )
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n ", duration );
system( "pause ");
}
[解决办法]
NAME
clock - Determine processor time

SYNOPSIS
#include <time.h>

clock_t clock(void);

DESCRIPTION
The clock() function returns an approximation of processor time used by
the program.
[解决办法]
(int)0.xxxxx = 0;
[解决办法]
我上面的那个写错了,是你执行的时间太短的原因,sleep( 1 );
slepp是计算的毫秒,你才slepp 1毫秒。当然,这也是可以显示出来的。
你不应该用%d,而且CLOCKS_PER_SEC,这样结果肯定是0.


因为只有几毫秒的事,换成秒之后,就成0了。
如果你要显示多少秒的话,用double类型来做。
[解决办法]
用gettimeofday吧
结构而非整数这一点点的不方便,不应该成为不使用它的理由。
[解决办法]
上边的兄弟们已经说的很明白了,你的输出格式有问题

[解决办法]
到处见到星星级人物!嗬嗬
[解决办法]
我给个程序:
#include <stdio.h>

#define get_timer(val) __asm__ __volatile__ ( "rdtsc ": "=A "(val))
#define TICK_PER_SECOND 3600000000ULL

int main()
{
unsigned long long now, start_time;
get_timer(start_time);
do{
printf( "Wait..\n ");
sleep(1);
get_timer(now);
printf( "%llu-%llu=%llu\n ", now, start_time, (now-start_time+TICK_PER_SECOND/2)/TICK_PER_SECOND);
}while(now-start_time <10*TICK_PER_SECOND);
return 0;
}

不过这里TICK_PER_SECOND要自己设置,同机器主频有关系,比如我的机器是3.6G.
不过对于多CPU的机器,结果就不一定完全正确
[解决办法]
代码时间太短,搞个时间复杂度高的试试

热点排行