所有评分最高的答案实际上都不是确定的“事实”……他们是在猜测的人!
您可以明确地知道哪些代码需要较少的汇编指令来执行,因为您可以查看编译器生成的输出汇编并查看哪些代码执行的汇编指令更少!
这是我用标志“gcc -std=c99 -S -O3lookingAtAsmOutput.c”编译的c代码:
#include <stdio.h>
#include <stdlib.h>
void swap_traditional(int * restrict a, int * restrict b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void swap_xor(int * restrict a, int * restrict b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main() {
int a = 5;
int b = 6;
swap_traditional(&a,&b);
swap_xor(&a,&b);
}
swap_traditional() 的 ASM 输出采用 >>> 11 <<< 指令(不包括“leave”、“ret”、“size”):
.globl swap_traditional
.type swap_traditional, @function
swap_traditional:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
pushl %ebx
movl (%edx), %ebx
movl (%ecx), %eax
movl %ebx, (%ecx)
movl %eax, (%edx)
popl %ebx
popl %ebp
ret
.size swap_traditional, .-swap_traditional
.p2align 4,,15
swap_xor() 的 ASM 输出采用 >>> 11 <<< 不包括“leave”和“ret”的指令:
.globl swap_xor
.type swap_xor, @function
swap_xor:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
movl 12(%ebp), %edx
movl (%ecx), %eax
xorl (%edx), %eax
movl %eax, (%ecx)
xorl (%edx), %eax
xorl %eax, (%ecx)
movl %eax, (%edx)
popl %ebp
ret
.size swap_xor, .-swap_xor
.p2align 4,,15
汇编输出摘要:
swap_traditional() 需要 11 条指令
swap_xor() 需要 11 条指令
结论:
两种方法都使用相同数量的指令来执行,因此在这个硬件平台上的速度大致相同。
经验教训:
当您有小代码片段时,查看 asm 输出有助于快速迭代您的代码并得出最快(即最少指令)的代码。即使您不必为每次代码更改都运行程序,您也可以节省时间。您只需要在最后使用分析器运行代码更改,以显示您的代码更改更快。
对于需要速度的繁重 DSP 代码,我经常使用这种方法。