C語言優化例項:C程式碼優化的必修課——查表
阿新 • • 發佈:2019-02-16
如果某些運算頻繁地進行,可以提前儲存該運算所有可能的結果,之後當需要用到該運算的時候,直接通過查表獲取結果即可。這種方法對時間效能優化特別有效,但是時間效能和空間效能總是一對矛盾的存在體,這樣做是以犧牲空間效能為代價的,這是因為我們需要儲存運算所有可能的結果。
舉例如下:
還是這個例子:
這是改為一層迴圈的版本,如果這個迴圈被頻繁呼叫的話,那麼i/1000這個除法運算和i%10這個取模運算在這個迴圈的每一次迭代時都會被執行,而且附加條件就是我們提前知道這兩個運算的輸入是在一個確定的範圍[0,10000),因此可以考慮將這兩個運算改為查表方式。 首先需要做的工作是在這個迴圈第一次被呼叫之前(一般放在初始化裡面),申請空間儲存這兩個運算的結果表(這裡採用陣列,其實如果這些表很大的話,最好使用calloc在堆區動態申請):
然後提前建立起這兩個結果表:
最後將迴圈中的運算替換為查表:
for (int i = 0; i < 1000*10; i++)
{
sum += data[i/1000][i%10];
}
這是改為一層迴圈的版本,如果這個迴圈被頻繁呼叫的話,那麼i/1000這個除法運算和i%10這個取模運算在這個迴圈的每一次迭代時都會被執行,而且附加條件就是我們提前知道這兩個運算的輸入是在一個確定的範圍[0,10000),因此可以考慮將這兩個運算改為查表方式。 首先需要做的工作是在這個迴圈第一次被呼叫之前(一般放在初始化裡面),申請空間儲存這兩個運算的結果表(這裡採用陣列,其實如果這些表很大的話,最好使用calloc在堆區動態申請):
int modTab[10000] = {0};//儲存取模運算的結果表 int divTab[10000] = {0};//儲存除法運算的結果表
然後提前建立起這兩個結果表:
int i = 0;
for (i = 0; i < 10000; ++i)
{
modTab[i] = i%10;
divTab[i] = i/1000;
}
最後將迴圈中的運算替換為查表:
for (int i = 0; i < 1000*10; i++)
{
sum += data[divTab[i]][modTab[i]];
}