欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2011年01月05日 23:44:05   作者:  
i++循環(huán)與i-–循環(huán)的執(zhí)行效率(遞增與遞減效率),需要的朋友可以參考下。
昨天同事問了我一個問題,有兩個循環(huán)語句:
復(fù)制代碼 代碼如下:

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

}

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

}

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

相關(guān)文章

  • 小項目中管理npm包版本的思路與方法

    小項目中管理npm包版本的思路與方法

    這篇文章主要給大家介紹了關(guān)于小項目中該如何管理npm包版本的思路與方法,npm包版本管理是非常重要的,文章通過示例代碼介紹的很詳細,需要的朋友可以參考下
    2021-06-06
  • 如何使用VSCode插件Remote-Tunnels連接服務(wù)器

    如何使用VSCode插件Remote-Tunnels連接服務(wù)器

    本文介紹使用Remote?-?Tunnels連接服務(wù)器,該方法需要遠程服務(wù)器有流暢的網(wǎng)絡(luò)環(huán)境,它使用微軟的服務(wù)來建立隧道,需要登錄GitHub,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • 風(fēng)中葉老師講述的學(xué)習(xí)方法(學(xué)習(xí)編程的朋友需要看)

    風(fēng)中葉老師講述的學(xué)習(xí)方法(學(xué)習(xí)編程的朋友需要看)

    風(fēng)中葉老師講述的學(xué)習(xí)方法(學(xué)習(xí)編程的朋友需要看),希望大家能按照說明的那樣,自己多動手動腦
    2008-10-10
  • vs2019生成dll并調(diào)用的實現(xiàn)示例

    vs2019生成dll并調(diào)用的實現(xiàn)示例

    這篇文章主要介紹了vs2019生成dll并調(diào)用的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • kali添加開機自啟的方法

    kali添加開機自啟的方法

    采用systemd的方法,kali默認是沒有rc.local的,需要自己創(chuàng)建。本方法也適用于ubuntu 18.04 64bit,對kali添加開機自啟知識感興趣的朋友一起看看吧
    2022-09-09
  • 在ubuntu18.04版本安裝vscode(2種)

    在ubuntu18.04版本安裝vscode(2種)

    這篇文章主要介紹了在ubuntu18.04版本安裝vscode,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • HTTP Referer詳解及Referer控制

    HTTP Referer詳解及Referer控制

    HTTP Referer是header的一部分,當瀏覽器向web服務(wù)器發(fā)送請求的時候,一般會帶上Referer,告訴服務(wù)器我是從哪個頁面鏈接過來的
    2018-04-04
  • Visual Studio安裝git插件的方法步驟

    Visual Studio安裝git插件的方法步驟

    這篇文章主要介紹了Visual Studio安裝git插件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 提高編程技能的11個建議

    提高編程技能的11個建議

    當你不熟悉編程的時候,你可能會覺得無從下手,并且不知道如何運用學(xué)到的知識。只要你通過了這一困難的學(xué)習(xí)階段,你就會發(fā)現(xiàn)一個全新的世界
    2014-08-08
  • tcp、udp、ip協(xié)議分析_動力節(jié)點Java學(xué)院整理

    tcp、udp、ip協(xié)議分析_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了tcp、udp、ip協(xié)議分析的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論