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()中迭代。
如何一次處理更多字節?用0x8080808080808080檢查至少8個字節並回退到每個字節循環應該是微不足道的。 – VTT
我認爲你的分析器對你說謊。除非你所使用的代碼非常輕巧,否則我不會看到這種位測試可能成爲熱點。唯一的*可能*問題是分支預測錯誤。你在使用什麼優化級別?停止位發生頻率如何?你能容忍添加編譯器特定的提示,以提出分支將走哪條路? –
你可以嘗試'while(!(* b&0x80))' - 然後在循環後執行停止位代碼。彙編程序是什麼樣的? –