2016-08-16 55 views
1

我正在並行運行一些線程。我想測量執行一個線程所需的時間以及執行整個程序所需的時間。我使用VC++,在Windows 7如何測量一個線程的執行時間?

我試圖測量它在調試,但後來我看到了這樣一個問題:https://stackoverflow.com/questions/38971267/improving-performance-using-parallelism-in-c?noredirect=1#comment65299718_38971267並通過Schnien給出了答案,它說:

Debugging of multiple threads is somehow "special" - when your Debugger halts at a breakpoint, the other threads will not be stopped - they will go on 

這是真的嗎?如果是我怎麼能以其他方式測量時間

感謝

+0

使用內置探查或併發可視電話˚F庫/ dd537632.aspx – Mars

回答

2

該聲明的確是真實的,只有遇到斷點線程將被暫停。

但是,爲了衡量執行時間,您根本不必使用調試。在測量執行時間更多信息,可以在下面的問題中找到:

Measure execution time in C (on Windows)

,你會想要做的是測量線程的功能,裏面的時間(通過在開始減去時間和結束時的功能)。您可以對該程序執行相同的操作,您可以使用thread.join來確保在最後一次測量時間之前所有線程的執行都結束。

1

使用簡單的計時器類創建秒錶功能,然後捕獲每個線程中的時間。另外,創建系統線程比使用std::async慢,後者可以返回值並傳播異常,這些異常使用線程導致程序終止,除非被線程捕獲。

#include <thread> 
#include <iostream> 
#include <atomic> 
#include <chrono> 
#include <future> 

// stopwatch. Returns time in seconds 
class timer { 
public: 
    std::chrono::time_point<std::chrono::high_resolution_clock> lastTime; 
    timer() : lastTime(std::chrono::high_resolution_clock::now()) {} 
    inline double elapsed() { 
     std::chrono::time_point<std::chrono::high_resolution_clock> thisTime=std::chrono::high_resolution_clock::now(); 
     double deltaTime = std::chrono::duration<double>(thisTime-lastTime).count(); 
     lastTime = thisTime; 
     return deltaTime; 
    } 
}; 

// for exposition clarity, generally avoid global varaibles. 
const int count = 1000000; 

double timerResult1; 
double timerResult2; 

void f1() { 
    volatile int i = 0; // volatile eliminates optimization removal 
    timer stopwatch; 
    while (i++ < count); 
    timerResult1=stopwatch.elapsed(); 
} 
void f2() { 
    volatile int i = 0; // volatile eliminates optimization removal 
    timer stopwatch; 
    while (i++ < count); 
    timerResult2=stopwatch.elapsed(); 
} 

int main() 
{ 
    std::cout.precision(6); std::cout << std::fixed; 
    f1(); std::cout << "f1 execution time " << timerResult1 << std::endl; 
    timer stopwatch; 
    { 
     std::thread thread1(f1); 
     std::thread thread2(f2); 
     thread1.join(); 
     thread2.join(); 
    } 
    double elapsed = stopwatch.elapsed(); 
    std::cout << "f1 with f2 execution time " << elapsed << std::endl; 
    std::cout << "thread f1 execution time " << timerResult1 << std::endl; 
    std::cout << "thread f1 execution time " << timerResult2 << std::endl; 
    { 
     stopwatch.elapsed(); // reset stopwatch 
     auto future1 = std::async(std::launch::async, f1); // spins a thread and descturctor automatically joins 
     auto future2 = std::async(std::launch::async, f2); 
    } 
    elapsed = stopwatch.elapsed(); 
    std::cout << "async f1 with f2 execution time " << elapsed << std::endl; 
    std::cout << "async thread f1 execution time " << timerResult1 << std::endl; 
    std::cout << "async thread f1 execution time " << timerResult2 << std::endl; 
} 

我的機器上創建線程增加每個線程大約0.3毫秒,而異步是每個線程只有大約0.05毫秒,因爲它是一個線程池來實現。 https://msdn.microsoft.com/en-us/:

f1 execution time 0.002076 
f1 with f2 execution time 0.002791 
thread f1 execution time 0.002018 
thread f1 execution time 0.002035 
async f1 with f2 execution time 0.002131 
async thread f1 execution time 0.002028 
async thread f1 execution time 0.002018 

[編輯]本來不正確的語句的前面(削減和過去的錯誤)