[英]Modulu vs if statement in a loop
我有這樣一個循環:
for(i = 0; i < arrayLength; i++)
{
result[i / 8] = SETBIT(result[i / 8], ++(*bitIndex), array[i]);
*bitIndex %= 8;
}
我想知道,如果使用上述樣式或以下樣式,哪種方法在性能方面會更好?
for(i = 0; i < arrayLength; i++)
{
result[i / 8] = SETBIT(result[i / 8], ++(*bitIndex), array[i]);
if(*bitIndex == 8) *bitIndex = 0;
}
這是用C編寫的,由GCC編譯,也可以理解。
謝謝
談論優化沒有任何意義...
對於您而言,對於大多數系統而言,這兩個示例之間沒有區別。 您真正應該關注的是編寫可讀代碼,而不是相反。 考慮將程序重寫為如下形式:
for(i = 0; i < arrayLength; i++)
{
(*bitIndex)++;
SETBIT(&result[i / 8], *bitIndex, array[i]);
*bitIndex %= 8;
}
這可能會產生與您已經擁有的二進制可執行文件完全相同的二進制可執行文件,+-一些CPU滴答聲。
老實說,它們之間只有一秒鍾的差異。 但是我相信第一個對於簡單的閱讀風格會稍好一些。 但是,這個問題引用了性能,我仍然認為第一個性能會因編譯器讀取/計算的信息較少而具有“永遠如此”的優勢。
您沒有說為什么bitIndex
是指針。 但是,假設bitIndex
是包含給定循環的函數的參數,我將把*bitIndex
東西從循環中拉出來,所以:
unsigned bi = *bitIndex ;
for(i = 0 ; i < arrayLength ; i++)
{
result[i / 8] = SETBIT(&result[i / 8], ++bi, array[i]) ;
bi %= 8 ;
} ;
*bitIndex = bi ;
[我假設++bi
是正確的,並且SETBIT()
需要1..8,其中bi
是0..7。]
如其他地方所述,編譯器將% 8
用作早餐並將其替換為& 0x7
(用於無符號,但不用於簽名)。 使用gcc -O2,以上代碼產生了一個48字節代碼循環(15條指令)。 在循環中擺弄*bitIndex
是50字節的代碼(16條指令),包括*bitIndex
一次讀取和兩次寫入。
任何人都猜測這有什么實際的區別……可能是內存的讀寫完全被循環的其余部分所包含。
如果bitIndex
是指向局部變量的指針,則編譯器將在循環期間將其值全部拉入寄存器中-因此,它認為值得這樣做!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.