i++ループとi-ループの実行効率
昨日同僚は私に質問しました.2つの循環文があります.
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
私の理解が正しいことを確認するために、実験をしました.
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命令が1つ足りない.