我写的一个程序中,在一个内部循环中有20%的时间用于查找三个数字的最小值,具体代码如下:
static inline unsigned int
min(unsigned int a, unsigned int b, unsigned int c)
{
unsigned int m = a;
if (m > b) m = b;
if (m > c) m = c;
return m;
}
有没有任何方法可以加快这个过程?如果需要,我也可以接受x86/x86_64的汇编代码。编辑:回答一些评论:
* 使用的编译器是gcc 4.3.3。
* 就汇编而言,我只是一个初学者。我在这里询问汇编,是为了学习如何做到这一点。
* 我有一个四核Intel 64运行的计算机,因此支持MMX/SSE等技术。
* 很难在这里发布循环,但我可以告诉你这是一个经过高度优化的Levenshtein算法实现的循环部分。
这是编译器给出的非内联版本 min 的代码。
.globl min
.type min, @function
min:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl 16(%ebp), %ecx
cmpl %edx, %eax
jbe .L2
movl %edx, %eax
.L2:
cmpl %ecx, %eax
jbe .L3
movl %ecx, %eax
.L3:
popl %ebp
ret
.size min, .-min
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
内联版本在 -O2 优化的代码中(连我的标记 mrk = 0xfefefefe,在调用 min() 前后都被 gcc 优化掉了),所以我无法获得它的实现。
更新:我测试了 Nils 和 ephemient 建议的更改,但使用 min() 的汇编版本并没有明显的性能提升。然而,通过使用 -march=i686 编译程序,我获得了 12.5% 的性能提升,我想这是因为整个程序都可以受益于 gcc 生成的新的更快指令。感谢大家的帮助。
P.S. - 我使用 Ruby 分析器测量性能(我的 C 程序是由 Ruby 程序加载的共享库),因此我只能获取由 Ruby 程序调用的顶层 C 函数的耗时,这些函数最终会调用堆栈中的 min()。请参阅此 问题。