用异或来交换两个变量能提高速度是错误的

在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式:
方式一
{
  x = x ^ y;
  y = x ^ y;
  x = x ^ y;
}
而不是采用临时变量实现交换:
方式二
{
  int temp;
  temp = a;     
  a = b;
  b = temp;
}
美其名曰:节省内存,提高运行速度。
临时变量交换的方式:

但是,真的节省了内存吗?
使用这种方式大部分时候,没有节省内存。因为,一般情况下编译器会将方式二中的临时变量优化到寄存器中,不使用堆栈。

真的提高了运行速度吗?
下边的博客给出了很详细的解答。
由于方式一,每一次执行都会多进行三次异或运算。又由于方式一的代码,在编译器理解起来,可能比较困难所以编译器翻译出来的代码,执行效率更低。

关于优化:
http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/1224/11834.html
“过早的优化是万恶之源”,当我们没有确定程序影响性能最重要的20%代码时,最好不要进行优化。同时,在优化时,不要过于相信经验,因为CPU技术,编译技术,操作系统等等,都会让看似可行的技术,失效。
在优化前,通过实际的运行确定影响性能的代码,然后进行优化。

最后,从软件工程的角度看,代码是写给人看的。最容易理解的代码,被维护的代价也最小,方式二的代码更容易阅读。

结语:
编译器很强大,CPU技术进步很快,我们的经验积累反而是最慢的。多反思,多总结。

附注:
如果要作为面试题,交换一个32位无符号整形数的方案,倒是更可以考虑一下采用位运算的方式解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值