Download presentation
Presentation is loading. Please wait.
1
有关程序计时方法的介绍 Yeung
2
讨论范围 计算机中的时间相关服务(函数)的主要应用 计时 延时
延时的主要内容和计时差不多,但和统计一个程序需要运行的时间不太相关,所以不做介绍
3
背景 计算机是怎么获得时间的? 时间是由谁提供的? 有哪些途径可以访问到与时间相关的服务?
4
方式一、获取系统内部时间 time_t time( time_t *timer );
From CRT library <time.h> time 返回自1970年1月1日午夜(UTC),到现在为止所经过的秒数。 参数timer提供一个存储时间的地址指针,可以为NULL,表示无需存储。 精度:1s
5
方式一、获取系统内部时间 time使用: #include <stdio.h> #include <time.h>
int main() { time_t start = time(0); dosomething(); printf(“Used Time = %d s\n”, time(0) - start); return 0; }
6
方式一、获取系统内部时间 clock_t clock( void ); From CRT library <time.h>
clock返回当前进程运行时间,时间单位 由CLOCKS_PER_SEC决定。 CLOCKS_PER_SEC表示1秒clock会增加的单位时间。 精度:1/CLOCKS_PER_SEC 注意:通常达不到
7
方式一、获取系统内部时间 clock使用: #include <stdio.h> #include <time.h>
int main() { clock_t start = clock(); dosomething(); printf(“Used Time = %.2lf s\n”, (clock() – start) / CLOCKS_PER_SEC); return 0; }
8
方式一、获取系统内部时间 以上提供的两个函数都来自CRT Library。 下面介绍WINAPI中有关的计时API
9
方式一、获取系统内部时间 DWORD GetTickCount(void);
Header: Declared in Winbase.h; include Windows.h. Library: Use Kernel32.lib. GetTickCount返回由系统开机到现在所经历的时间,单位毫秒。 精度:1ms 注意:实际达不到
10
方式一、获取系统内部时间 DWORD timeGetTime(VOID); 来自多媒体计时器 Header: Windows.h
Library: Winmm.lib
11
方式二、高性能计时器(CPU时间戳) BOOL QueryPerformanceFrequency
(LARGE_INTEGER *lpFrequency ); BOOL QueryPerformanceCounter (LARGE_INTEGER *lpPerformanceCount ); Header: Windows.h Library: Kernel32.lib 来自CPU内部的时间戳,也可以通过RDTSC指令获取时间戳
12
方式二、高性能计时器(CPU时间戳) LARGE_INTEGER 说白了就是一个64位无符号整数(unsigned __int64)
13
方式二、高性能计时器(CPU时间戳) 使用方法: int main() { __int64 Frequency, Start, End;
QueryPerformanceFrequency((LARGE_INTEGER*)&Frequency); QueryPerformanceCounter((LARGE_INTEGER*)&Start); dosomething(); QueryPerformanceCounter((LARGE_INTEGER*)&End); double t = double(End - Start) / Frequency; printf("Used Time = %.2lf s\n", t); }
14
方式二、高性能计时器(CPU时间戳) 缺点: 前两种方式只适合计时使用,并不能很好统计程序运行了多久
15
方式三、获取进程CPU时间 BOOL GetProcessTimes( HANDLE hProcess,
LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime ); Header: Windows.h Library: Kernel32.lib. 当前进程的hProcess句柄可以用 HANDLE GetCurrentProcess(void); 获得 精度:和第一种方法介绍的API可以到达的精度一样。
16
方式三、获取进程CPU时间 The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME; 说白了就是一个64位无符号整数
17
方式三、获取进程CPU时间 用法: int main() { FILETIME t1, t2, t3, t4; SYSTEMTIME t;
GetProcessTimes( GetCurrentProcess(), &t1, &t2, &t3, &t4 ); FileTimeToSystemTime(&t4, &t); printf("Hour = %d\tMin = %d\tSec = %d\tMs = %d\n", t.wHour, t.wMinute, t.wSecond, t.wMilliseconds); }
18
方式三、获取进程CPU时间 辅助API: BOOL FileTimeToSystemTime( Header: Windows.h
const FILETIME* lpFileTime, LPSYSTEMTIME lpSystemTime ); Header: Windows.h Library: Use Kernel32.lib 将FileTime转换成SystemTime
19
方式三、获取进程CPU时间 The SYSTEMTIME structure represents a date and time using individual members for the month, day, year, weekday, hour, minute, second, and millisecond. typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME;
20
总结 前两种方式适合计时 最后一种方法适合统计程序运行时间 各种方法各有特点,应该灵活运行
21
谢谢大家,如有不对,敬请指正
Similar presentations