国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

i++循環與i-循環的執行效率(遞增與遞減效率)

2024-07-21 02:02:22
字體:
來源:轉載
供稿:網友
昨天同事問了我一個問題,有兩個循環語句:
復制代碼 代碼如下:

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

}

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

}

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

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--的循環條件:
4c: e51b3014 ldr r3, [fp, #-20]
50: e3530000 cmp r3, #0 ; 0x0
54: cafffff5 bgt 30 <loop_dec+0x30>

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

i++的循環條件:
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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屯门区| 义马市| 安吉县| 洞头县| 乐陵市| 崇阳县| 和林格尔县| 郁南县| 平原县| 文水县| 尚义县| 炎陵县| 民和| 聊城市| 合作市| 昌都县| 金乡县| 西林县| 新绛县| 清丰县| 韶关市| 湘潭市| 芦溪县| 宣威市| 荔浦县| 金华市| 广灵县| 吴川市| 含山县| 察雅县| 磴口县| 瑞丽市| 铅山县| 牟定县| 高邮市| 定远县| 枞阳县| 永吉县| 洛浦县| 仁化县| 土默特右旗|