主頁 > 知識庫 > i++循環(huán)與i-–循環(huán)的執(zhí)行效率(遞增與遞減效率)

i++循環(huán)與i-–循環(huán)的執(zhí)行效率(遞增與遞減效率)

熱門標(biāo)簽:網(wǎng)站文章發(fā)布 呼叫中心市場需求 美圖手機(jī) 檢查注冊表項(xiàng) 鐵路電話系統(tǒng) 服務(wù)器配置 智能手機(jī) 銀行業(yè)務(wù)
昨天同事問了我一個問題,有兩個循環(huán)語句:
復(fù)制代碼 代碼如下:

for(i = n; i > 0; i--)
{

}

for(i = 0; i n; i++)
{

}

為什么前者比后者快?
我當(dāng)時的解釋是:
i- -操作本身會影響CPSR(當(dāng)前程序狀態(tài)寄存器),CPSR常見的標(biāo)志有N(結(jié)果為負(fù)), Z(結(jié)果為0),C(有進(jìn)位),O(有溢出)。i > 0,可以直接通過Z標(biāo)志判斷出來。
i++操作也會影響CPSR(當(dāng)前程序狀態(tài)寄存器),但只影響O(有溢出)標(biāo)志,這對于i n的判斷沒有任何幫助。所以還需要一條額外的比較指令,也就是說每個循環(huán)要多執(zhí)行一條指令。
(這是五年前tjww告訴我的,當(dāng)時他在AVR上寫一個LCD驅(qū)動程序,使用后者LCD會閃爍,使用前者則沒有問題。)
為了確認(rèn)我的理解是正確的,做了個實(shí)驗(yàn):
復(fù)制代碼 代碼如下:

int loop_dec(int n)
{
int i = 0;
int v = 0;

for(i = n; i > 0; i--)
v +=i;

return v;
}

int loop_inc(int n)
{
int i = 0;
int v = 0;

for(i = 0; i n; i++)
v +=i;

return v;
}

用arm-linux-gcc編譯,然后反匯編:
i--的循環(huán)條件:
4c: e51b3014 ldr r3, [fp, #-20]
50: e3530000 cmp r3, #0 ; 0x0
54: cafffff5 bgt 30 loop_dec+0x30>

i++的循環(huán)條件:
b8: e51b3018 ldr r3, [fp, #-24]
bc: e1520003 cmp r2, r3
c0: bafffff4 blt 98 loop_inc+0x30>結(jié)果和我想象的并不一樣,這是怎么回事呢?我想可能因?yàn)闆]有加優(yōu)化選項(xiàng),于是加上-O選項(xiàng),結(jié)果變?yōu)椋?
i--的循環(huán)條件:
14: e2500001 subs r0, r0, #1 ; 0x1
18: 1afffffc bne 10 loop_dec+0x10>

i++的循環(huán)條件:
3c: e2833001 add r3, r3, #1 ; 0x1
40: e1500003 cmp r0, r3
44: 1afffffb bne 38 loop_inc+0x14>這下沒錯了,果然少一個cmp指令。
文章出處:http://www.limodev.cn/blog
您可能感興趣的文章:
  • PHP 函數(shù)執(zhí)行效率的小比較
  • 提高ASP頁面執(zhí)行效率的方法分析
  • 優(yōu)化innerHTML操作(提高代碼執(zhí)行效率)
  • 根據(jù)mysql慢日志監(jiān)控SQL語句執(zhí)行效率
  • JavaScript執(zhí)行效率與性能提升方案
  • 查詢mysql中執(zhí)行效率低的sql語句的方法
  • Oracle提高sql執(zhí)行效率的心得建議
  • 分享50個提高PHP執(zhí)行效率的技巧

標(biāo)簽:上海 長治 新疆 滄州 樂山 紅河 河南 沈陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《i++循環(huán)與i-–循環(huán)的執(zhí)行效率(遞增與遞減效率)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266