首页
社区
课程
招聘
[旧帖] [求助]请问如何判断i++与++i哪一个运行更快 0.00雪花
发表于: 2007-8-21 21:27 10824

[旧帖] [求助]请问如何判断i++与++i哪一个运行更快 0.00雪花

2007-8-21 21:27
10824
各位大侠,请问如何判断i++与++i哪一个运行更快,在没有编译优化的前提下,哪个执行效率更高?在for循环中大多数是用的i++,难道i++执行效率更高?  如何将VC源码转为对应的汇编代码?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (29)
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
在VC里直接你进入调试模式就可以看到对应的汇编代码了
2007-8-21 21:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
但是那是反汇编出来的代码,还是就是VC对应的汇编代码?

我尝试
#include <iostream.h>

void main()
{
        int a;
        a++;
        ++a;
        cout<<"Finsh"<<endl;
}

用OD  OllyIce  VC反汇编出来的都是

MOV EAX,DWORD PTR SS:[EBP-4]
ADD EAX,1
MOV DWORD PTR SS:[EBP-4],EAX
MOV ECX,DWORD PTR SS:[EBP-4]
ADD ECX,1
MOV DWORD PTR SS:[EBP-4],ECX

然后将VC中的CODE变为

#include <iostream.h>

void main()
{
        int a;
        a++;
        ++a;
        cout<<"Finsh"<<endl;
}

反汇编出来的还是

MOV EAX,DWORD PTR SS:[EBP-4]
ADD EAX,1
MOV DWORD PTR SS:[EBP-4],EAX
MOV ECX,DWORD PTR SS:[EBP-4]
ADD ECX,1
MOV DWORD PTR SS:[EBP-4],ECX

难道a++与++a一样?

另有人说a++是先复制内容再进行加1,然后复制回去,而++a是直接在原位置执行+1。所以++a比a++要快。真的是这样?我们for的时候多是用i++么?

到底哪个更快??
2007-8-22 15:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
补充一个问题:反汇编出来的代码与VC对应的汇编代码是一回事儿么?
2007-8-22 16:07
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
5
如果代码写成
i=1;
k=1+(i++);
那么k=2;
如果是
k=1+(++i);
那么k=3
照这样看来,如果最后要看的是i的值,那么在一条表达式内,变化得比较快的应该是++i,因为会先自加一,再进行运算,i++则用i去运算,再自加一!
2007-8-22 16:18
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
6
]

高级语言中的一个变量根据数据宽度对应相应的内存单元!
2007-8-22 16:20
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
7
在for循环
比如
for(i=0;i<10;i++)
"()"里有三条表达式,对于楼主的问题,我们关注第三条"i++"
这是独立的一条语句,所以,无论i++或++i,i都会自加一,
看反汇编出来的代码:
MOV EAX,DWORD PTR SS:[EBP-4]  //eax=i
ADD EAX,1                                      //eax<-eax+1
MOV DWORD PTR SS:[EBP-4],EAX  //i=eax
MOV ECX,DWORD PTR SS:[EBP-4]
ADD ECX,1                                     //ps:这里和上面一样
MOV DWORD PTR SS:[EBP-4],ECX

一样的
2007-8-22 16:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=大菜一号;348890]如果代码写成
因为会先自加一,再进行运算,i++则用i去运算,再自加一QUOTE]

也就是说:i++与++i执行的速度是一样的都是各经过一次加一与参与运算,两者的区别只在于参与其他运算的时候的执行的顺序是不一样的?

如果从概念上讲我比较赞同此说法,但如果从汇编上,甚至机器码上看对于不参与其他运算的i++与++i的执行有区别么?
2007-8-22 16:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9

不太懂哦?  希望可以说的详细点儿
2007-8-22 16:29
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
10
没有任何区别`
汇编代码反映出cpu的运算过程,最容易看出了!

你看反汇编出来的代码就知道,i++和++i,除了中间使用的寄存器不一样之外,没啥不同,使用寄存器比直接访问内存可快多了
2007-8-22 16:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我可不可以这样理解?
对于i++与++i两者执行的速度是一样的,因为二者对应的汇编代码只是执行的顺序不同。但在参与其他运算的时候,++i比i++先完成运算。
对否?
2007-8-22 16:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不对吧,i++与++i使用的寄存器没有什么不同,当i++在前时,或++i在前时 都是先使用EAX寄存器。
2007-8-22 16:35
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
13
定义变量,等于叫操作系统为本程序开辟内存空间
一个byte类型,就是一个字节单元!

i=1;  //给i所对应的内存单元赋值1,如  mov  byte ptr[xxxxxxx],1

而不系所谓的寄存器,和内存单元不同,这也就是为啥汇编程序比高级语言程序运行效率高的原因!运算在于cpu,说白了,cpu拥有自家的饭碗,就是寄存器,如果让cpu,跨过一条数据总线去访问内存,和cpu直接在自家操作自家的饭碗相比,你说哪个快!
2007-8-22 16:36
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
14
++i比i++先完成自已本身的运算
2007-8-22 16:37
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
15
那eax和ecx有啥不同,名字不同而已
2007-8-22 16:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
如果不参与其他的运算只是像我代码中的
#include <iostream.h>

void main()
{
  int a;
  a++;
  ++a;
  cout<<"Finsh"<<endl;
}

两者执行速度或者说执行耗时是不是一样的?
2007-8-22 16:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
似乎有资料称EAX比ECX执行速度更快,所以编程时优先考了EAX
2007-8-22 16:40
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
18
就两条语句来讲是一样的,
不过a++在前面,当然是先执行,哈哈哈哈
2007-8-22 16:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
eax 比 ecx 快...
2007-8-22 16:42
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
20
哈哈哈,关于这个,我下一秒钟驾着ufo去美国找盖茨问一问
2007-8-22 16:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我想我没表达清楚,我的意思是:如果我用汇编写代码,想表达与i++相同的代码是不是也是如同反汇编出来的那样,
MOV EAX,DWORD PTR SS:[EBP-4]
ADD EAX,1
MOV DWORD PTR SS:[EBP-4],EAX
走三步,还是有更优化的方法?
2007-8-22 16:44
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
22
用汇编写代码,直接使用寄存器
inc eax

哈哈哈,一步``哈哈,没必要的时候就不用变量了!
2007-8-22 16:46
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
找比尔该死问没用,得问“英特儿”小妞
2007-8-22 16:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
耗时,不是执行顺序。执行顺序,包括k=1+(i++);k=1+(++i)我理解
2007-8-22 16:47
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
25
哦哦,那就应该一样吧!
2007-8-22 16:50
0
游客
登录 | 注册 方可回帖
返回
//