国产探花免费观看_亚洲丰满少妇自慰呻吟_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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽江市| 宁夏| 牡丹江市| 乌兰察布市| 鄂托克前旗| 新余市| 得荣县| 南部县| 阿克苏市| 古浪县| 阿合奇县| 和龙市| 渝北区| 文水县| 芜湖市| 红安县| 沧州市| 鹿泉市| 高安市| 桃源县| 乐亭县| 临洮县| 当雄县| 兴义市| 阳谷县| 呼玛县| 鲁甸县| 凤山市| 长沙县| 定襄县| 苍山县| 陇南市| 奇台县| 牡丹江市| 邹城市| 新津县| 普安县| 准格尔旗| 抚宁县| 五华县| 肇东市|