[英]How can I measure CPU time in C++ on windows and include calls of system()?
我想在C ++算法上運行一些基准測試,並希望獲得所需的CPU時間,具體取決於輸入。 我在Windows 7上使用Visual Studio 2012.我已經發現了一種在Windows中計算CPU時間的方法: 如何在Linux / Windows上測量CPU時間和掛鍾時間?
但是,我在我的算法中使用system()命令,這不是那樣測量的。 那么,我如何測量CPU時間並通過system()包含我的腳本調用次數?
我應該添加一個小例子。 這是我的get_cpu_time函數(來自上面描述的鏈接):
double get_cpu_time(){
FILETIME a,b,c,d;
if (GetProcessTimes(GetCurrentProcess(),&a,&b,&c,&d) != 0){
// Returns total user time.
// Can be tweaked to include kernel times as well.
return
(double)(d.dwLowDateTime |
((unsigned long long)d.dwHighDateTime << 32)) * 0.0000001;
}else{
// Handle error
return 0;
}
}
到目前為止,這工作正常,當我制作一個程序,對一些數組進行排序(或做一些其他需要一些時間的東西),它工作正常。 但是,當我使用system() - 命令時,就像這種情況一樣,它不會:
int main( int argc, const char* argv[] )
{
double start = get_cpu_time();
double end;
system("Bla.exe");
end = get_cpu_time();
printf("Everything took %f seconds of CPU time", end - start);
std::cin.get();
}
給定的exe文件的執行以相同的方式測量並且花費大約5秒。 當我通過system()運行它時,整個過程需要0秒的CPU時間,這顯然不包括exe文件的執行。
一種可能性就是在系統調用上得到一個HANDLE,這有可能嗎?
Linux的:
它實際上會打印程序占用的CPU時間。 但是如果你在程序中使用線程,它將無法正常工作。 在完成CPU時間之前,您應該等待線程完成它的工作。 所以基本上你應該這樣寫:
WaitForSingleObject(threadhandle, INFINITE);
如果您不知道您在程序中使用了什么(如果它是多線程的,或者不是......),您可以創建一個執行該作業的線程並等待線程終止並測量時間。
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
int main()
{
DWORD dwThreadId;
HANDLE hThread;
int startcputime, endcputime, wcts, wcte;
startcputime = cputime();
hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
NULL, // argument to thread function
0, // use default creation flags
dwThreadIdArray);
WaitForSingleObject(hThread, INFINITE);
endcputime = cputime();
std::cout << "it took " << endcputime - startcputime << " s of CPU to execute this\n";
return 0;
}
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
//do your job here
return 0;
}
您可以嘗試使用boost計時器。 它具有跨平台能力。 boost網站的示例代碼:
#include <boost/timer/timer.hpp>
#include <cmath>
int main() {
boost::timer::auto_cpu_timer t;
for (long i = 0; i < 100000000; ++i)
std::sqrt(123.456L); // burn some time
return 0;
}
如果您使用C ++ 11(或有權訪問它), std::chrono
具有計算程序運行時間所需的所有函數。
在創建任何子進程之前,您需要將您的進程添加到Job對象。 然后子進程將自動在同一作業中運行,您可以在JOBOBJECT_BASIC_ACCOUNTING_INFORMATION
結構的TotalUserTime
和TotalKernelTime
成員中找到所需的TotalUserTime
, TotalKernelTime
成員可通過QueryInformationJobObject
函數獲得。
更多信息:
從Windows 8開始, 支持嵌套作業 ,因此即使某些程序已經依賴於作業對象,也可以使用此方法。
我認為沒有跨平台機制。 使用CreateProcess啟動應用程序,使用WaitForSingleObject完成應用程序,將允許您獲得直接后代時間。 之后你需要工作對象來完成會計(如果你需要時間孫子)
您也可以為外部采樣分析器提供一個鏡頭。 我在Windows下使用了免費贈品“Sleepy”[ http://sleepy.sourceforge.net/]甚至更好的“非常困”[ http://www.codersnotes.com/sleepy/]個人資料 ,並且非常滿意結果 - 幾分鍾內格式化的信息幾乎沒有任何努力。
有一個名為“Shiny”的類似項目[ http://sourceforge.net/projects/shinyprofiler/]應該適用於Windows和* nix。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.