能力值:
( LV2,RANK:10 )
|
-
-
2 楼
都一样的吧.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我认为关键在比较那个指令上
如是i--时,因为是和0比较,所以可使用
test eax,eax ;直接寄存器比较,速度能加快吧
jnz XXXXXXX
这样的
使用i++时,因为是和100比较,所以要使用
cmp eax,100 ;和立即数比较,指令使用花的时间长
jnz xxxxxxxx
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢上面2位的回答,我是在VS2005平台上反汇编的,下面是汇编代码
for(int i = 10; i> 0; i--)
55 push ebp
8B EC mov ebp,esp
81 EC CC 00 00 00 sub esp,0CCh
53 push ebx
56 push esi
57 push edi
8D BD 34 FF FF FF lea edi,[ebp-0CCh]
B9 33 00 00 00 mov ecx,33h
B8 CC CC CC CC mov eax,0CCCCCCCCh
F3 AB rep stos dword ptr es:[edi]
7: for(int i = 10; i> 0; i--)
C7 45 F8 0A 00 00 00 mov dword ptr [i],0Ah
EB 09 jmp wmain+30h (411390h)
8B 45 F8 mov eax,dword ptr [i]
83 E8 01 sub eax,1
89 45 F8 mov dword ptr [i],eax
83 7D F8 00 cmp dword ptr [i],0
7E 02 jle wmain+38h (411398h)
8: {
9: }
EB EF jmp wmain+27h (411387h)
10: return 0;
33 C0 xor eax,eax
11: }
5F pop edi
5E pop esi
5B pop ebx
8B E5 mov esp,ebp
5D pop ebp
C3 ret
for(int i = 0; i < 10; i++)
55 push ebp
8B EC mov ebp,esp
81 EC CC 00 00 00 sub esp,0CCh
53 push ebx
56 push esi
57 push edi
8D BD 34 FF FF FF lea edi,[ebp-0CCh]
B9 33 00 00 00 mov ecx,33h
B8 CC CC CC CC mov eax,0CCCCCCCCh
F3 AB rep stos dword ptr es:[edi]
7: for(int i = 0; i < 10; i++)
C7 45 F8 00 00 00 00 mov dword ptr [i],0
EB 09 jmp wmain+30h (411390h)
8B 45 F8 mov eax,dword ptr [i]
83 C0 01 add eax,1
89 45 F8 mov dword ptr [i],eax
83 7D F8 0A cmp dword ptr [i],0Ah
7D 02 jge wmain+38h (411398h)
8: {
9: }
EB EF jmp wmain+27h (411387h)
10: return 0;
33 C0 xor eax,eax
11: }
5F pop edi
5E pop esi
5B pop ebx
8B E5 mov esp,ebp
5D pop ebp
C3 ret
汇编代码有不一样的地方,请问在哪可以查到像这样的汇编代码的机器时间啊?这样我就可以判断出哪个的效率高了
|
能力值:
( LV9,RANK:610 )
|
-
-
5 楼
3楼的说法有点意思~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
i--更快些。
少一条cmp指令。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
额。lz要多大规模的计算啊,这个--和++有必要搞得这么清楚么
|
能力值:
( LV8,RANK:122 )
|
-
-
8 楼
3楼正解, 做一些核心模块时,还是有效果的
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
你贴的汇编代码是DEBUG模式下的,编译器没有优化,所以看不出区别,你自己用汇编来写一个,就知道区别在哪了。
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
真要效率就别用C,直接写汇编
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
应该是i--快
delphi后续的几个版本,用for i:=0 to 100时,有可能就编译成了 for i:=100 downto 0
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
相差很小,不知道讨论这个还有什么意义?
|
能力值:
( LV5,RANK:60 )
|
-
-
13 楼
为软还开发什么VS2008,大家都学汇编算了。
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
2个for循环的效率是一样滴
|
能力值:
( LV9,RANK:250 )
|
-
-
15 楼
编译的时候不要调试模式 之后再看看代码 求效率还是汇编..
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
请提供编译参数,有没有进行优化??
|
能力值:
(RANK:210 )
|
-
-
17 楼
从逻辑实现上面讲,sub有一个取2'的过程,执行要比add慢,现在新的处理器不知道怎么实现的了.
这个是可以克服的,比如初始化的时候找个地方存个负数,每次add即可.
代码上讲,判断zf比较容易,所以综合起来i--效率高些,不过,不是每个循环都可以这样转化的.
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
我猜是i++快
貌似i--那个更容易branch prediction miss
|
能力值:
( LV9,RANK:180 )
|
-
-
19 楼
++快吧
祖先时代只有加法器
|
能力值:
( LV3,RANK:20 )
|
-
-
20 楼
智能编译器如果for循环内部没用到循环变量的时候,都会编译成递减循环.
递减循环少一次CMP指令.代码会短一点.
速度也会快一点点.大概一个CPU周期.但是现在一秒CPU可以运行N多次周期.这个完全不值得一提.
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
Delphi 2007
原代码:
procedure TForm2.Button1Click(Sender: TObject);
var
i,j: Integer;
begin
for i := 1 to 100 do
Inc(j);
ShowMessage(IntToStr(j));
end;
编译时没有打开优化选项:
Unit2.pas.30: for i := 1 to 100 do
0045BF87 C745F801000000 mov [ebp-$08],$00000001
Unit2.pas.31: Inc(j);
0045BF8E FF45F4 inc dword ptr [ebp-$0c]
0045BF91 FF45F8 inc dword ptr [ebp-$08]
Unit2.pas.30: for i := 1 to 100 do
0045BF94 837DF865 cmp dword ptr [ebp-$08],$65
0045BF98 75F4 jnz $0045bf8e
Unit2.pas.32: ShowMessage(IntToStr(j));
0045BF9A 8D55EC lea edx,[ebp-$14]
0045BF9D 8B45F4 mov eax,[ebp-$0c]
0045BFA0 E8BFC7FAFF call IntToStr
0045BFA5 8B45EC mov eax,[ebp-$14]
0045BFA8 E8D310FDFF call ShowMessage
编译时打开优化选项:
Unit2.pas.30: for i := 1 to 100 do
0045BF7C B864000000 mov eax,$00000064
Unit2.pas.31: Inc(j);
0045BF81 43 inc ebx
Unit2.pas.30: for i := 1 to 100 do
0045BF82 48 dec eax
0045BF83 75FC jnz $0045bf81
Unit2.pas.32: ShowMessage(IntToStr(j));
0045BF85 8D55FC lea edx,[ebp-$04]
0045BF88 8BC3 mov eax,ebx
0045BF8A E8D5C7FAFF call IntToStr
0045BF8F 8B45FC mov eax,[ebp-$04]
0045BF92 E8E910FDFF call ShowMessage
|
能力值:
( LV12,RANK:210 )
|
-
-
22 楼
现代化编译器理论效率是一样的, 除非手动写汇编。
不过题目感觉没多大意义。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
肯定 ++i 和 --i 效率快啊.
后加加/后减减 ,需要保存原来的值到副本中,然后将相加后的结果再赋值到 i 中.
前加加/前减减 ,不用保存原来值的副本,直接加 1 ,效率更快.
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
恩
我看到就想说这个来的
i++和i--的效率肯定没有++i和--i的效率高
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
您的意思是直接运行,然后再看汇编代码?
|
|
|