簡體   English   中英

如何在Windows上測量C ++中的CPU時間並包含system()的調用?

[英]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結構的TotalUserTimeTotalKernelTime成員中找到所需的TotalUserTimeTotalKernelTime成員可通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM