2017-04-24 50 views
0

我在讀停止位編碼數據流,我需要能夠識別具有停止位的字節。按位與結果的優化

我的代碼片段:

const unsigned char *b; // Pointer to the datastream 

    ... 

    // Test the sign bit 
-> if (*b & 0x40) 
    { 
     // Negative number, do relevant stuff 
     ... 
    } 

    while(true) 
    { 
->  if (!(*b & 0x80)) 
     { 
      // Not the stopbit 
      ... 
     } 
     else 
     { 
      // Reached the stopbit, breaking out of the loop 
      ... 
      b++; 
      break; 
     } 

     b++; 
    } 

此功能在緊密循環運行,並且需要實時工作。我用箭頭標記了剖析器顯示爲「熱」的行,這是對符號位和停止位的測試。

任何想法如何讓這些操作得到優化(特別是符號位測試,因爲它似乎需要更多時間,即使它在循環之外)?

編輯: 應該在前面提到過,指針b用在循環內部,因此我不能在while()中迭代。

+0

如何一次處理更多字節?用0x8080808080808080檢查至少8個字節並回退到每個字節循環應該是微不足道的。 – VTT

+0

我認爲你的分析器對你說謊。除非你所使用的代碼非常輕巧,否則我不會看到這種位測試可能成爲熱點。唯一的*可能*問題是分支預測錯誤。你在使用什麼優化級別?停止位發生頻率如何?你能容忍添加編譯器特定的提示,以提出分支將走哪條路? –

+0

你可以嘗試'while(!(* b&0x80))' - 然後在循環後執行停止位代碼。彙編程序是什麼樣的? –

回答

0

我會擺脫while(true)連同循環內的(額外的)測試。 但我不確定這是否真的是問題,因爲「不停止位」代碼很可能會比位測試花費更長的時間。

unsigned char c = 1; 
while (!((c=*p++) & 0x80)) { 
    // Not the stop bit stuff 
    printf ("%d\n", c); 
} 
// stop bit reached stuff 
+0

可能應該在前面提到過這個,但是指針在循環中使用,我不能在while()中迭代它。我會在編輯中添加這個 –