1. 程式人生 > >天人合一之畢設——實踐階段11——測試多組benchmark產生的問題

天人合一之畢設——實踐階段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陣列傳入時下點功夫解決吧