在寫程式的時候,我們常常會希望知道程式總共跑了多久,或是某個 function 需要執行多久,來瞭解我們的 performance。通常會使用的方法是利用 time.h 裡面的 clock() 來達到我們想要的目的,程式大概會長這樣:
這樣當然是沒啥不好的,不過人總是懶惰,有時候會覺得要寫那麼多行 code 是很麻煩的事情。所以就有了 boost::timer 的誕生。
Boost timer 的使用相當簡單,基本上只有三個 class。接下來就一一介紹。
Class Timer
timer 這個 class 會測量經過的時間,通常使用在程式當中一些比較繁瑣的 timing 測量方面。實做其實就是利用上面講過的 clock() function。要注意的是,timer 最多可以測量的時間大概是 596.5 小時(或是更少)。以下是一個簡單的例子:
如此便可以輸出 t1 這個 timer 經過的時間。
Class progress_timer
progress_timer 跟 timer 很相似,差別是在它會自動在 destruction 的時候輸出 progress_timer 所經過的時間。例子如下:
如此程式會於結束的時候輸出如 0.06 s 之類的訊息:
Class progress_display
progress_display 這個 class 則就是傳統我們會看到的 progress bar 功能。這個只是要給人看,讓人知道這隻程式正在跑。舉例來說,如果我們想要來在 map 當中插入 element,在插入的途中想利用 progress_display 來知道進度,可以用以下的 code:
#include <ctime> #include <iostream> using namespace std ; int main( void ) { clock_t t = clock() ; // do something.... cout << "The program runs " << (clock()-t)/CLK_TCK << " seconds" << endl ; return 0 ; }
這樣當然是沒啥不好的,不過人總是懶惰,有時候會覺得要寫那麼多行 code 是很麻煩的事情。所以就有了 boost::timer 的誕生。
Boost timer 的使用相當簡單,基本上只有三個 class。接下來就一一介紹。
Class Timer
timer 這個 class 會測量經過的時間,通常使用在程式當中一些比較繁瑣的 timing 測量方面。實做其實就是利用上面講過的 clock() function。要注意的是,timer 最多可以測量的時間大概是 596.5 小時(或是更少)。以下是一個簡單的例子:
#include <boost/timer.hpp> #include <iostream> using namespace std ; using namespace boost ; int main( void ) { timer t1 ; // do something.. cout << t1.elapsed() << endl ; return 0 ; }
如此便可以輸出 t1 這個 timer 經過的時間。
Class progress_timer
progress_timer 跟 timer 很相似,差別是在它會自動在 destruction 的時候輸出 progress_timer 所經過的時間。例子如下:
#include <boost/progress.hpp> int main() { progress_timer t; // start timing // do something ... return 0; }
如此程式會於結束的時候輸出如 0.06 s 之類的訊息:
Class progress_display
progress_display 這個 class 則就是傳統我們會看到的 progress bar 功能。這個只是要給人看,讓人知道這隻程式正在跑。舉例來說,如果我們想要來在 map 當中插入 element,在插入的途中想利用 progress_display 來知道進度,可以用以下的 code:
#include <boost/progress.hpp> #include <map> #include <iostream> using namespace std ; using namespace boost ; int main( void ) { map在大約有 70% 的 element 被插入時,progress_display 會顯示big_map ; progress_display show_progress( 1000000 ) ; for ( int i = 0 ; i < 1000000 ; i++ ) { big_map.insert( make_pair(i,i) ) ; ++show_progress ; } return 0 ; }
0% 10 20 30 40 50 60 70 80 90 100% |----|----|----|----|----|----|----|----|----|----| ************************************