关于c中的“++”与“+=”的效率

wj19451880 2005-01-19 07:31:38
小弟刚遇到个问题,是关于运行的效率的
在C语言中有n++,可以实现加一,也可以用n +=1来实现
问题就来了,后者的运行花费的时间是前者的多少?假设是x86的
我的感觉是一样的啊,又不想是移位的那种算法又差别,都用三条汇编就完成的。

还有能不能把C中常用运算指令的运行效率跟大家说说~~~~
谢谢!!!!!!!!!
...全文
586 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
WangWeiGK 2005-04-15
  • 打赏
  • 举报
回复
钻牛角尖。
关于效率的问题不应该在这上面纠缠太多吧?
这是与编译器实现纠缠在一起的,没有绝对的答案。
xueqt 2005-04-10
  • 打赏
  • 举报
回复
效率相同,具体说明见
http://blog.csdn.net/xueqt/archive/2005/04/10/341628.aspx
xueqt 2005-04-10
  • 打赏
  • 举报
回复
效率相同,具体说明见
http://blog.csdn.net/xueqt/archive/2005/04/10/341628.aspx
xueqt 2005-04-10
  • 打赏
  • 举报
回复
效率相同,具体说明见
http://blog.csdn.net/xueqt/archive/2005/04/10/341628.aspx
AruS 2005-03-26
  • 打赏
  • 举报
回复
实际上 n+=1 要比 ++n快。。。

如果编译器 可以把 n+=1 优化成 ++n

++n 比 n++快,后者要创造一个临时变量以便返回
AruS 2005-03-26
  • 打赏
  • 举报
回复
NO,这个是要看编译器的。。。
PDD123 2005-03-26
  • 打赏
  • 举报
回复
用的地方都不一样。
gudengyeren 2005-03-25
  • 打赏
  • 举报
回复
i应该差不子多少吧,计算机运行那么快
weigoal 2005-02-17
  • 打赏
  • 举报
回复
一样的
XueBoy163 2005-02-17
  • 打赏
  • 举报
回复
N++的汇编是INC N吧?
CodeProject-Jerry 2005-02-16
  • 打赏
  • 举报
回复
反正都比 n = n + 1快
seedundersnow 2005-02-11
  • 打赏
  • 举报
回复
如果允许编译优化,通常应当是一样的。
wj19451880 2005-02-05
  • 打赏
  • 举报
回复
不好意思哈,这几天出差刚回来,才看到。谢谢朋友们的支持。

我在想的时候是遇到这样的问题,就是在一个缓冲里边取的是单个递增的(在网络中接受服务器的原始12位A/D(速率为单通道64K/采集卡)和其它的开关数据,由于数据量比较大,所以要考略效率问题),在定义协议的时候就是在客户端是用按通道排序好,还是按采样的次序排序的好,便于客户机的处理(客户机还有相当的任务要做,所以需要考略)。

下面假设是32通道的抽取数据的话:
基本的汇编意思的是:
a++: lea al memory
add al 1
mov al memory

a+=32: lea al memory
add al 32
mov al memory
如果是将a设置为寄存器变量的话可以提高大概3~5倍,但这常常是不允许的,况且还要经常的读取,顶多不过2倍。估计的。

我希望有哪位朋友能将其它的C 中的实现相同功能的语句进行效率排序,就像移位指令和乘除法指令一样的有很大的差别,我暂时还没有收集到这方面的“经书”,所以希望有朋友能把这些相关的资料贴上来供大家分享。谢谢

很感谢楼上的僵哥的费心回帖。
僵哥 2005-02-04
  • 打赏
  • 举报
回复
不好意思,上述测试代码有误,通过C转出的汇编代码看,效果是一样的。也就是说
a++与a+=1是等效的,写时可能写的是a++或a+=1但是编译器会转换为a=a+1,所以是等效的。
僵哥 2005-02-04
  • 打赏
  • 举报
回复
试验证明后者比前者效率高;
用下面的代码可以测得
======================
__int64 m;
__int64 n;
unsigned int s1,s2,e1,e2;
m=n=0;
s1=GetTickCount();
for(__int64 i=0;i<100000000;i++)m++;
e1=GetTickCount();
s2=GetTickCount();
for(__int64 i=0;i<100000000;i++)n+=1;
e2=GetTickCount();
ShowMessage("m++:"+IntToStr(e1-s1)+" n+=1:"+IntToStr(e2-s2));
======================
xcyxl 2005-02-02
  • 打赏
  • 举报
回复
有道理
zbtsv2005 2005-02-01
  • 打赏
  • 举报
回复
说的对
extreme0001 2005-01-28
  • 打赏
  • 举报
回复
前者效率更高,前者只在Register中运行
Goldbach 2005-01-27
  • 打赏
  • 举报
回复
gz
Kshape_zh 2005-01-24
  • 打赏
  • 举报
回复
后者的效率明显要快许多
加载更多回复(1)

256

社区成员

发帖
与我相关
我的任务
社区描述
其他产品/厂家
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧