windows平台程序CPU佔用率的計算

2021-06-18 11:09:31 字數 4045 閱讀 1055

在程序的效能資料採集過程中,經常用到的乙個效能指標就是程序的cpu佔用率,下面給出它的計算方法及示例**。

1、cpu佔用率的定義

cpu佔用率:指程序在乙個時間段內消耗的cpu時間與該時間段長度的比值。

2、cpu佔用率計算方法

根據上述定義,可以得到程序cpu佔用率計算公式如下:

程序消耗的cpu時間 = 程序消耗的核心態時間 + 程序消耗的使用者態時間,即 costtime = kerneltime + usertime

程序的cpu佔用率 = 程序消耗的cpu時間 / 重新整理周期

3、cpu佔用率計算涉及到的api

示例程式用到的主要api

getsysteminfo    我們主要用它來獲取系統中cpu核心個數

openprocess     用來開啟指定程序的控制代碼

getprocesstimes   根據openprocess返回的控制代碼,獲取程序的kerneltime和usertime

其它api(用於執行緒等其它情況下的計算)

openthread      獲取指定執行緒的控制代碼

getthreadtimes    根據openthread返回的控制代碼,獲取執行緒的kerneltime和usertime (可用於執行緒cpu佔用率計算)

getsystemtimes   獲取總的cpu時間idletime kerneltime usertime,可用於系統總的cpu佔用率計算(注:多核cpu中返回的是所有cpu核時間的總和)

ntquerysysteminformation  

這是個native api,可以獲取到許多資訊。可以獲得更細緻的cpu使用率資訊。(如每個核心的使用率)

4、示例**

1 #include "

stdafx.h

"2 #include 3 #include 4 #include 5 #include 6

7#define my_process_error(condition) do while (false)89

static dword g_sdwtickcountold = 0; //

上一次的tick計數

10static large_integer g_slgprocesstimeold; //

儲存程序上一次的時間占用

11static dword g_sdwprocessorcorenum = 0; //

處理器核心數

12static handle g_shexitevent = null; //

執行緒退出控制

1314 typedef struct

_target_process

15target_process, *ptarget_process;

1819

2021

/*@brief 獲取找到的與指定程序名相符的第乙個程序id

22* @param [in] cpszexefilename 程序可執行檔名(不帶路徑)

23* @param [in/out] dwpid 返回找到的名字符合的第乙個程序id

24* @return 成功 : s_ok 失敗 : 錯誤碼

25*/

26 hresult findfirstprocessidbyname(const tchar* cpszexefilename, dword &dwpid)27;

31 handle hsnapshot =null;

3233

if (null ==cpszexefilename)

3438

39 pe.dwsize = sizeof

(processentry32);

);41

if (invalid_handle_value ==hsnapshot)

42

4647

if (false == process32first(hsnapshot, &pe))

4852

53 hr =s_false;

54do

5562 }while(process32next(hsnapshot, &pe));

6364

exit0:

65if

(hsnapshot)

6670

71return

hr;72}73

74/*

@brief 獲取程序的cpu佔用率

75* @param [in] hprocess 程序控制代碼

76* @param [in] dwelepsedtime 取樣間隔時間(毫秒)

77* @return 成功 : cpu佔用率 失敗 : -1

78*/

79int getprocesscpupercent(const handle hprocess, const

dword dwelepsedtime)

80103

else

104107

108return

nproccpupercent;

109}

110111 unsigned __stdcall workerthread(void *parg)

112137

138 dwcurrenttickcount =gettickcount();

139 dwelapsedtime = dwcurrenttickcount -g_sdwtickcountold;

140 g_sdwtickcountold =dwcurrenttickcount;

141 nprocesscpupercent =getprocesscpupercent(hprocess, dwelapsedtime);

142 wprintf(l"

cpu = %d\n

", nprocesscpupercent);

143 } while (1

);

144exit0:

145if

(hprocess)

146150

151return0;

152}

153154

int _tmain(int argc, _tchar*argv)

155;

161target_process strutargetprocess;

162163

if (argc > 1

)164

171172 getsysteminfo(&sysinfo);

173 g_sdwprocessorcorenum =sysinfo.dwnumberofprocessors;

174175 g_shexitevent =createevent(null, true, false, null);

176my_process_error(g_shexitevent);

177178 hthread = (handle)_beginthreadex(null, 0, workerthread, &strutargetprocess, 0, &uitid);

179my_process_error(hthread);

180181

_getch();

182setevent(g_shexitevent);

183waitforsingleobject(hthread, infinite);

184}

185else

186189

190exit0:

191if

(hthread)

192196

197if

(g_shexitevent)

198202

203return0;

204 }

from:

windows平台程序CPU佔用率的計算

在程序的效能資料採集過程中,經常用到的乙個效能指標就是程序的cpu佔用率,下面給出它的計算方法及示例 1 cpu佔用率的定義 cpu佔用率 指程序在乙個時間段內消耗的cpu時間與該時間段長度的比值。2 cpu佔用率計算方法 根據上述定義,可以得到程序cpu佔用率計算公式如下 程序消耗的cpu時間 程...

liunx伺服器java單程序佔cpu較高

介面程式負載較高問題處理 問題描述 伺服器負載經常較高,top檢視一直存在高cpu單程序,問題分析 單程序佔cpu持續較高導致負載高 問題處理 1 根據top命令,檢視占用cpu很高的程序pid,如20348 2 ps mp 20438 o thread,tid,time sort rn,檢視該程序...

windows那些討厭的CPU占用程序

1 任意生成乙個檔案,並把檔案改名為ws2 32.dll,然後複製到某程式的目錄下,該程式便無法開啟。把ws2 32.dll放到ie程式目錄下,加個空的 iexplore.exe.manifest 資料夾到ie程式目錄,一般為c program files internet explorer,則ie...