在程序的效能資料採集過程中,經常用到的乙個效能指標就是程序的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 "from: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 }
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...