C语言获取CPU tick

Python047

C语言获取CPU tick,第1张

如果是获取 cpu 时钟 的 tick:clock_t tick1,tick2tick1=clock()// 开机到执行这句时的毫秒数 ms 等待一会tick2=clock()// 开机到执行这句时的毫秒数 ms dt = (double) (tick2 - tick1) // 或得时间差。===============如果是 获取 CPU cycle count#include <stdint.h>// Windows#ifdef _WIN32#include <intrin.h>uint64_t rdtsc(){return __rdtsc()}// Linux/GCC#elseuint64_t rdtsc(){ unsigned int lo,hi __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)) return ((uint64_t)hi <<32) | lo}#endif===================获取高精度时间(MS VC++ 6.0编译器):// Pentium instruction "Read Time Stamp Counter". __forceinline unsigned _int64 My_clock(void) { _asm_emit 0x0F _asm_emit 0x31 }unsigned _int64 Start(void) { return My_clock()} unsigned _int64 Stop(unsigned _int64 m_start, unsigned _int64 m_overhead) {return My_clock()-m_start - m_overhead}==========获取cpu 速度(MS VC++ 6.0编译器):void get_CPU_speed(){unsigned _int64 m_start=0, m_overhead=0unsigned int CPUSpeedMHzm_start = My_clock()m_overhead = My_clock() - m_start - m_overheadprintf("overhead for calling My_clock=%I64d\n", m_overhead)m_start = My_clock()wait_ms(2000)CPUSpeedMHz=(unsigned int) ( (My_clock()- m_start - m_overhead) / 2000000)printf("CPU_Speed_MHz: %u\n",CPUSpeedMHz)}

clock()函数

clock()是c/c++中的计时函数,而与其相关的数据类型是clock_t。在msdn中,查得对clock函数定义如下:

clock_t

clock(void)

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的cpu时钟计时单元(clock

tick)数,在msdn中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中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

#include

#include

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")

}

在笔者的机器上,运行结果如下:

time

to

do

10000000

empty

loops

is

0.03000

seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变clocks_per_sec的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准c/c++中,最小的计时单位是一毫秒。

time_t

time(

time_t

*timer

)

返回值是1970年到现在的秒数

用long型接就可以了

参数也是同样意义

long

time_s

=

0

time_s

=

time(

null

)

//

time_s就是1970年到现在的秒数

或者

long

*

time_s

=

null

time(time_s)

//

*time_s就是1970年到现在的秒数

要计算前后一段时间的话之前取一次time,之后取一次相减就知道用了多少秒了

如果tick的原型是这个

int tick()

那么打印它的printf语句可以是这样写

printf("%d", tick())

信息太少了哟