天人合一之畢設——實踐階段11——測試多組benchmark產生的問題
之前師兄就說一個benchmark太少,拿差不多四個進行比較結果會豐厚一些。
從一開始的迷茫疑惑,到終於改好了剩下3個benchmark,分別是bsearch/bfs/heapsort
聽上去還是比較有代表性吧。。。到時候老師問這是什麼標準程式我就直接說是師兄給我的,甩鍋
果然,全面的測試之後還是能發現一些問題
1.插樁階段:迴圈體裡包含if或else等其他語句體的},不能將他們}誤判為循化結束(都想自己手動改了)
2.判斷物件訪問:
(1)迴圈裡的if語句,可能有時候執行,有時候不執行,但是當if陣列傳進來時,【14,14,14】這三個說不定就是100次迴圈中唯一執行的三次。在我之前的程式碼中,對每一句是先判斷的if再判斷的迴圈,所以可能導致了一個迴圈體中的if語句只判斷了一次,很不科學。
解決方式:初步想的是,判斷if之前先看判斷迴圈標誌,如果是在迴圈體中,則對這個if語句判斷n次,譬如上面的第14行判斷100次,自然有三次是符合的(自然順序就是不完全正確的)
如果迴圈體內有多個if語句 【14,17,14,14,17】這樣如果對14行的if語句連續判斷n次,由於後面跟了一個17,則會導致他認為只有一次
總結:最好是提前知道迴圈體的起止s-e(在插樁時記錄下來),然後s-e迴圈n次,n作為外層迴圈,而非內層迴圈
雙重迴圈的情況應該很難搞,外層s1-e1[n1] ,內層s2-e2[n2,是個陣列,長度為n1,因為存在條件判斷的情況,內層迴圈每次執行的次數不一定]
for(i:1~n1)
for(s1~e1){
encounter innner repeat{
for(1~n2[i]){
for(s2-e2)
}
}
}
(2)迴圈體裡的呼叫函式語句,這就意味著這個函式要被多次呼叫
解決方式:和上面一樣,把所有的迴圈體起止都記錄下來(插樁時print語句把起止也輸出來),遇到迴圈體時就裡面的執行n次,這樣自然可以把函式也呼叫多次。
for{
A=1
F(A)
B=1
}
梳理一下程式碼中的內容
distract函式最外層的迴圈肯定是子函式的起止行
repeatFlag = false;
doubleRepeatFlag = false;
for(i: fun.s~fun.e){
if(repeatFlag) continue;
if(i==repeat1.start){
repeatFlag = true;
for(j: 1~repeatCnt1){
for(k: repeat1.s~repeat1.e){
//還要判斷雙重迴圈
if(doubleRepeatFlag) continue;
if(k==repeat2.start){
doubleRepeatFlag = true;
for(m: repeat2.s~repeat2.e){
判斷是否if是否執行,不執行continue
malloc\free\visit的判斷
}
}
else{ if\malloc\free\visit\呼叫函式的判斷} //對非內層迴圈語句
if(k==repeat2.end) doubleRepeatFlag=false;
}
}
else{ if\malloc\free\visit\呼叫函式的判斷} //對非迴圈語句
if(i==repeat1.end) repeatFlag = false;
}
我試圖這樣改了程式碼 發現工作量實在太大了 果斷決定不追求完全順序 反正區域性熱也是直接看迴圈 迴圈體裡if判斷的事情從if陣列傳入時下點功夫解決吧