參考手冊:
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: