DWORD dwStart = GetTickCount()
//这里运行你的程序代码
DWORD dwEnd = GetTickCount()
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
这个函数只精确到55ms,1个tick就是55ms。
2
timeGetTime()基本等于GetTickCount(),但是精度更高
DWORD dwStart = timeGetTime()
//这里运行你的程序代码
DWORD dwEnd = timeGetTime()
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
虽然返回的值单位应该是ms,但传说精度只有10ms。
3
用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
clock_t clock ( void )
#include <time.h>
clock_t t = clock()
long sec = t / CLOCKS_PER_SEC
他是记录时钟周期的,实现看来不会很精确,需要试验验证;
4
#include<iostream>
#include<ctime>
using namespace std
int main()
{
time_t begin,end
begin=clock()
//这里加上你的代码
end=clock()
cout<<"runtime: "<<double(end-begin)/CLOCKS_PER_SEC<<endl
}
5
unix时间相关,也是标准库的
这些在<time.h>
1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息
time_t timegm(struct tm *tm)
2.mktime使用时区信息
time_t mktime(struct tm *tm)
timelocal 函数是GNU扩展的与posix函数mktime相当
time_t timelocal (struct tm *tm)
3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息
struct tm * gmtime(const time_t *clock)
4.localtime使用时区信息
struct tm * localtime(const time_t *clock)
1.time获取时间,stime设置时间
time_t t;
t = time(&t)
2.stime其参数应该是GMT时间,根据本地时区设置为本地时间
int stime(time_t *tp)
3.UTC=true 表示采用夏时制
4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间
5.设置时区推荐使用setup来设置
6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效
time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t
看看你的系统是否有time_t64,它能表示更大的时间范围
Window里面的一些不一样的
CTime MFC类,好像就是把time.h封了个类,没扩展
CTime t = GetCurrentTime()
SYSTEMTIME 结构包含毫秒信息
typedef struct _SYSTEMTIME {
WORD wYear
WORD wMonth
WORD wDayOfWeek
WORD wDay
WORD wHour
WORD wMinute
WORD wSecond
WORD wMilliseconds
} SYSTEMTIME, *PSYSTEMTIME
SYSTEMTIME t1
GetSystemTime(&t1)
CTime curTime(t1)
WORD ms = t1.wMilliseconds
SYSTEMTIME sysTm
::GetLocalTime(&sysTm)
在time.h中的_strtime() //只能在windows中用
char t[11]
_strtime(t)
puts(t)
6
下面是转的一个用汇编的精确计时方法
---------------------------------------------------------------------------------------
如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。
在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。
我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.
下面看看实现的代码:
//用汇编实现获取一段代码运行的时间
#include<iostream>
using namespace std
void GetClockNumber (long high, long low)
void GetRunTime()
int main()
{
long HighStart,LowStart,HighEnd,LowEnd
long numhigh,numlow
//获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
for(int i= 0i<100000i++ )
{
for(int i= 0i<100000i++ )
{
}
}
//获取代码结束时cpu内部计数器的值,并减去初值
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
获取两次计数器值得差
sub eax, LowStart
cmp eax, 0如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
//把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow
//输出代码段运行的时钟周期数
//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<<(double) (timer /1.1/1000000000) <<endl
return 0
}
这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,
因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edxmov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。
如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。
不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了
网上找的,对你应该有帮助。。。
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。
它的具体功能是返回处理器调用某个进程或函数所花费的时间。函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,其中clock_t是用来保存时间的数据类型。
在time.h文件中,我们可以找到对它的定义:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t
#define _CLOCK_T_DEFINED
#endif
clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK CLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000,这表示硬件滴答1000下是1秒,因此要计算一个进程的时间,用clock()除以1000即可。
clock的返回值一直是0的原因:
1、编译器优化,for循环实际根本没执行,直接跳过去了,所以时间为0。
2、clock计算的是程序占用cpu的时间,如果你的程序执行的动作很少,那么clock算出的时间也很少。
3、建议使用time gettimeofday函数来计时。
扩展资料:
C语言中clock()函数的程序例1:(TC下运行通过)
#include <stdio.h>
#include <time.h>
int main(void)
{
clock_t start, end
start = clock()
delay(2000)
end = clock()
printf("The time was: %f\n", (double)(end - start) / CLK_TCK)
return 0
}
说明:CLK_TCK 定义在TC中的time.h中:#define CLK_TCK18.2。
在VC6.0中也有关于CLK_TCK的宏定义,不过其值不再是18.2,而是1000。
实际上在VC6.0中CLK_TCK已完全等同CLOCKS_PER_SEC。
参考资料来源:百度百科-clock()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)