交换变量A,B的代码运行效率分析

本文探讨了在C语言中交换变量A和B的几种方法,包括使用临时变量和不使用临时变量的策略。通过运行效率分析,发现在大量循环执行下,使用临时变量的代码效率更高。编译器优化对于 xor 操作的影响以及汇编代码的效率对比也被详细讨论。最后得出结论,简单使用临时变量的交换方式在大多数情况下更为合适。
摘要由CSDN通过智能技术生成

我们写代码时,经常会碰到需要将两个数值变量互相交换的情况。
例如,要求交换变量A,B的值,写如下C代码。

情况1,利用临时变量T
T = A; A = B; B = T;
情况2,不利用临时变量
A ^= B; B ^= A; A ^= B;

那么,这两种实现方式的运行效率如何呢?


在Visual C++的编译环境里,如果不打开优化选项的话,C的代码会编译成如下代码。

情况1

    mov eax,A
    mov T, eax

    mov eax,B
    mov A, eax

    mov eax,T
    mov B, eax

情况2:

    mov eax,B
    xor eax,A
    mov A,eax

    mov eax,A
    xor eax,B
    mov B,eax

    mov eax,B
    xor eax,A
    mov A,eax

代码分析

  • 情况1有6个mov指令。
  • 情况2也有6个mov指令,还有另外3个xor指令。

从代码长度的情况来看,情况1比较理想。

运行效率分析

  • 对代码进行100’000’000次左右的循环执行。
  • 情况1的指令周期大约是204 clocks。
  • 情况2的指令周期大约是602 clocks。

从运行时间效率的情况看,也是情况1比较理想。


看到这里,也许会有人提出,如果不用C实现呢?如果用更好的编译器呢?我们直接写汇编代码怎么样?
对,这是一个不错的想法,可以帮助我们直达问题的核心。于是我们开始试着直接写汇编代码。


情况3,不利用临时变量,占用3个寄存器:

    mov eax,A
    mov ebx,B

    mov ecx,eax
    mov eax,ebx
    mov ebx,ecx

    mov A,eax
    mov B,ebx

代码分析

  • 7个mov指令。

运行效率分析

  • 100’000’000次左右的循环执行,指令周期大约是169 clocks。

情况4,不利用临时变量,占用2个寄存器:

    mov eax,A
    mov ebx,B

    xor eax,ebx
    xor ebx,eax
    xor eax,ebx

    mov A,eax
    mov B,ebx

代码分析

  • 4个mov指令,3个xor指令。

运行效率分析

  • 100’000’000次左右的循环执行,指令周期大约是246 clocks。

情况5,不利用临时变量,占用2个寄存器,使用xchg指令:

    mov eax,A
    mov ebx,B

    xchg eax,ebx

    mov A,eax
    mov B,ebx

代码分析

  • 4个mov指令,1个xchg指令。

运行效率分析

  • 100’000’000次左右的循环执行,指令周期大约是220 clocks。

情况6,不利用临时变量,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值