使用Intel編譯器(5)PGO(7)PGO工具之tselect(test prioritization Tool)

來源:互聯網
上載者:User
參考手冊:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm

說明:本系列文章為個人筆記,如有不正確之處,請參考官方相關文檔,如果錯誤發現,我會盡量更新修改。另外,以下內容不保證對於所有版本的編譯器都正確,編譯器的實現也可能有一些變化之處,具體參考官方文檔。

更多說明請參考http://blog.csdn.net/gengshenghong/article/details/7034748中補充說明部分。

Summary:這裡的工具是tselect,test prioritization Tool,從字面上,測試優先順序工具,應該也是和測試相關的,所以測試人員可能比較容易理解,下面只是大概理解一下tselect的內容和如何使用,對於測試理論,我也不太懂。

關於測試優先順序可參考:

http://blog.csdn.net/lengyue_112/article/details/375342

http://edu.21cn.com/ruankao/g_185_695002-1.htm等

(1) 測試優先順序的作用

參考相關內容理解。

(2) PGO測試優先順序工具tselect的使用介紹

1. 需要的檔案

類似於codecov工具,tselect涉及的檔案有:使用/Qprof-gen:srcpos選項編譯得到的spi檔案,由dyn檔案合并的dpi檔案。

2. tselect使用

使用:tselect -dpi_list file

其中-dpi_list是一個必須的選項,還有一些其它可選選項。

下面是tselect工具使用的典型模型:

簡單的理解,第一步,使用/Qprof-gen:srcpos得到spi檔案和輔助可執行檔,多次使用不同的測試資料運行輔助可執行檔,分別得到其dpi檔案,將dpi檔案以列表的形式放入一個文字檔中,使用tselect工具即可。

(3)執行個體:

以http://blog.csdn.net/gengshenghong/article/details/7053847中的差異覆蓋的代碼為例子(代碼如下):

// File: tselect.cpp  #include <stdio.h>    void foo()  {      printf("This is foo\n");  }    void bar()  {      printf("This is bar\n");  }    void foobar()  {      printf("This is foobar\n");  }    int main(int argc, char* argv[])  {      int count = argc;      switch(count)      {          case 0:              printf("Case0\n");              break;          case 1:              printf("Case1\n");              foo();              break;          case 2:              printf("Case2\n");              bar();              break;          case 3:              printf("Case3\n");              foo();              bar();              break;          case 4:              printf("Case4\n");              foobar();              break;      }  } 

@echo OFF  rem #File: build.bat  set exeargs=arg1 arg2 arg3rem #can set env vars in command line or in this file before run this bat file.    if exist *.obj del *.obj  if exist *.exe del *.exe  if exist *.dyn del *.dyn  if exist *.lock del *.lock  if exist *.dpi del *.dpi  if exist *.spi del *.spi  if exist *.spl del *.spl    icl tselect.cpp -o tselect.exe /Od /Qprof-gen:srcpos /nologo  tselect.exe %exeargs%  profmerge

分別得到執行case1234情況下對應的dpi和spi,如下:

PGOPTI.SPI
pgopti1.dpi
pgopti2.dpi
pgopti3.dpi
pgopti4.dpi

建立檔案list.txt如下:

pgopti4.dpipgopti3.dpipgopti2.dpipgopti1.dpi

然後運行:

tselect -dpi_list list.txt

輸出如下:

Intel(R) C++/Fortran Compiler test prioritizer for applications running on Intel(R) 64, Version 12.1 Build 20111128Copyright (C) 1985-2011 Intel Corporation.  All rights reserved.WARNING: no SPI file name was specified, assumed .\pgopti.spi.Total number of tests   =  4Total block coverage    ~  91.67Total function coverage ~ 100.00 num  %RatCvrg  %BlkCvrg  %FncCvrg  Test Name @ Options ---  --------  --------  --------  -------------------   1    50.00     45.83     75.00   pgopti3.dpi   2    72.73     66.67    100.00   pgopti4.dpi   3    86.36     79.17    100.00   pgopti2.dpi   4   100.00     91.67    100.00   pgopti1.dpi

說明:運行tselect需要一個列表檔案和對應的多個dpi檔案,以及一個spi檔案(預設是pgopti.spi),不需要原始碼(這是和codecov不同的,codecov需要原始碼,否則結果錯誤)。

1. 相關基本參數含義

上面的tselect的輸出相關參數的含義如下:

(total number of tests)測試的總數為4,由list.txt決定,list.txt列舉了多少個dpi檔案,就是多少。

(total block coverage)總的塊覆蓋率為91.67%。

(total function coverage)總的函數覆蓋率為100%。

下面的表格分別對應於列表中每一個測試的情況。

從上面的結果可以知道如下資訊,運行pgopti3.dpi對應的測試覆蓋了程式45.83%的基本塊,佔到了所有四次測試可以獲得的總的塊覆蓋率的50%(即45.83%/91.67%=50%),另外,它對應的測試覆蓋了75%的函數覆蓋率(一共有foo、bar、foobar和main四個函數,case3的時候覆蓋了其中的foo、bar和main三個函數,所以是75%);運行pgopti4.dpi對應的測試後,累積覆蓋了程式66.67%的基本塊,佔到了總的四次測試可以獲得的塊覆蓋率的72.73%(即66.67%/91.67%=72.73%),另外,它對應的測試累積覆蓋了100%的函數覆蓋率(case4會覆蓋foobar函數,所以所有函數都被覆蓋到了);其它的類似。

說明:

A、這裡是有一個順序問題,後面的測試是前面的累積的結果。另外,不太清楚這個pgopti3、4、2、1的順序是如何確定的,跟list.txt的列舉順序沒關係,無論怎麼樣的順序列舉,得到的tselect結果的順序都是pgopti3、4、2、1!Why?(更新:參考下面的內容得到答案)

B、由於顯示的是累積的結果,如果某一次測試對前面的測試結果的覆蓋率等資料不產生變化,那麼就不會顯示在下面的表格中。比如list.txt如下:

pgopti4.dpipgopti3.dpipgopti2.dpipgopti1.dpipgopti4.dpipgopti3.dpipgopti2.dpipgopti1.dpi

對應的結果如下:

Total number of tests   =  8Total block coverage    ~  91.67Total function coverage ~ 100.00 num  %RatCvrg  %BlkCvrg  %FncCvrg  Test Name @ Options ---  --------  --------  --------  -------------------   1    50.00     45.83     75.00   pgopti3.dpi   2    72.73     66.67    100.00   pgopti4.dpi   3    86.36     79.17    100.00   pgopti2.dpi   4   100.00     91.67    100.00   pgopti1.dpi

測試總數為8,但是表格只有4行。

2. 估算最少測試次數上面提到了顯示的順序和list.txt列舉的順序無關,為什嗎?說白了,是我沒有理解到底這裡的tselect工具是幹嘛用的!下面來分析我對這個工具功能的理解。PS:這個tselect的作用可能和上面說的測試中的測試優先順序的概念不一定一樣,個人理解。要理解還是根據文檔開始,上面舉例的功能是tselect的準系統,文檔是:“Minimizing the Number of Tests”。之所以沒有理解,是由於對Minimize的含義的理解,其有一個含義為“為...做最低估計”,如果知道了這層含義,那麼上面的順序問題就很容易理解了,其作用是“估算最小測試次數”,我的理解是:tselect對於多次測試的資料,根據這些資料,分析出如何進行測試(按照什麼樣的順序執行這些測試),能儘快的達到最大的覆蓋率,這裡面就是一個“測試優先順序”的問題了。比如上面的例子,很顯然,pgopti3.dpi(執行case3),裡面調用了foo和bar兩個函數,這樣就能儘快的覆蓋更多函數了,而先執行pgopti4.dpi就能達到最大的函數覆蓋率100%,如果先執行pgopti1.dpi或pgopti2.dpi是不會改變函數覆蓋率的(當然,會改變塊覆蓋率)。總之,tselect給出了一個建議的優先順序來執行這些測試,從而達到最大的覆蓋率,對於某些測試的執行不會改變覆蓋率的,就不會在結果中列出來了。

3. 估算最少執行時間

有了上面的理解,下面的內容就簡單了。可以在list.txt的每一行測試後面加一個表示時間的資料,然後,使用-mintime選項來估算完成所有測試的最小執行時間的順序(如果不使用-mintime選項,也可以在每行測試後寫一個時間,這不是必須的,寫了也沒有什麼影響,如果使用了-mintime選項,那麼每行必須有一個時間,這個時間要符合一定的格式)。如下是list.txt的例子:

pgopti4.dpi 00:00:40:04pgopti3.dpi 00:00:30:03pgopti2.dpi 00:00:20:02pgopti1.dpi 00:00:10:01pgopti1.dpi 00:00:10:01

注意:其中dpi檔案名稱和後面的時間之間可以有任意多個空格,但是,不能有tab(這點有點不友好)。

運行:

tselect -dpi_list list.txt -mintime

得到:

Total number of tests   =  5Total block coverage    ~  91.67Total function coverage ~ 100.00Total execution time    =     1:50:11 num  elapsedTime   %RatCvrg  %BlkCvrg  %FncCvrg  Test Name @ Options ---  -----------  --------  --------  --------  -------------------   1        10:01    36.36     33.33     50.00   pgopti1.dpi   2        30:03    59.09     54.17     75.00   pgopti2.dpi   3      1:00:06    77.27     70.83     75.00   pgopti3.dpi   4      1:40:10   100.00     91.67    100.00   pgopti4.dpi

所以,一共五次測試,其中總的執行時間只需要1:50:11就能達到最大的覆蓋率,順序就是按照時間順序從少到多的,其中list.txt中的最後一個pgopti1.dpi(第五次測試)是不需要進行的,因為它的執行對覆蓋率沒有任何影響。(當然,這裡故意用同一個dpi資料,所以肯定不會改變覆蓋率,但是不同的dpi也可以不改變覆蓋率的)。

4. 其他選項

到這裡,就基本理解了tselect的作用和用法了,接下來就看看其它的選項。

-help: 顯示協助。
-dpi_list file: 唯一一個必須有的選項,指定列表檔案。
-spi file: 指定spi檔案。
-o file: 指定tselect輸出的報告的檔案,預設情況下是輸出到控制台的,指定-o後,直接輸出到檔案,控制台不輸出。
-mintime: 估算最小執行時間。
-nototal: 報告中不包含total的那些資訊。
-verbose: 工具會顯示運行時的更多日誌資訊,且報告中會顯示更詳細的資訊。

-cutoff value: 其參數是一個值,指定tselect工具在累積塊覆蓋率達到預計的總的塊覆蓋率的value%的值的時候就終止。比如:tselect -dpi_list list.txt -cutoff 10.00,表示只要塊覆蓋率達到10%就終止。下面是一個列子:

tselect -dpi_list list.txt -cutoff 49

得到:

Total number of tests   =  5Total block coverage    ~  91.67Total function coverage ~ 100.00 num  %RatCvrg  %BlkCvrg  %FncCvrg  Test Name @ Options ---  --------  --------  --------  -------------------   1    50.00     45.83     75.00   pgopti3.dpi

同樣的例子,使用:tselect -dpi_list list.txt -cutoff 51,得到:

Total number of tests   =  5Total block coverage    ~  91.67Total function coverage ~ 100.00 num  %RatCvrg  %BlkCvrg  %FncCvrg  Test Name @ Options ---  --------  --------  --------  -------------------   1    50.00     45.83     75.00   pgopti3.dpi   2    72.73     66.67    100.00   pgopti4.dpi

-srcbasedir dir:
-comp:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.