__declspec(dllexport)
float foo(float x) {
return (x < 0) ? x * -1 : x;
}
Run Code Online (Sandbox Code Playgroud)
这是计算一个非常幼稚的做法abs(x),其中x一个float.我在发布模式下编译了这个并启用了我能找到的所有优化.结果asm是:
; 4 : return (x < 0) ? x * -1 : x;
movss xmm1, DWORD PTR _x$[ebp]
xorps xmm0, xmm0
comiss xmm0, xmm1
jbe SHORT $LN3@foo
xorps xmm1, DWORD PTR __xmm@80000000800000008000000080000000
$LN3@foo:
movss DWORD PTR tv66[ebp], xmm1
fld DWORD PTR tv66[ebp]
Run Code Online (Sandbox Code Playgroud)
如您所见,这仍然包含分支和条件跳转.然而a float是由IEEE754定义的,因此我可以将实现更改为简单地将符号位设置为0:
__declspec(dllexport)
float foo(float x) {
void* bar = &x;
__int32 …Run Code Online (Sandbox Code Playgroud) extern inline double getColorPercentage(uint8_t *pixel, uint8_t *pixel2) {
//pixel 1 is 255, 255, 255
//pixel 2 is 0, 0, 0
//match is 0
//pixel 1 and 2 is 255, 255, 255
//match is 1.0
return (255-fabs(pixel[2] - pixel2[2])) * (255-fabs(pixel[1] - pixel2[1])) * (255-fabs(pixel[0] - pixel2[0])) /16581375.0;
}
Run Code Online (Sandbox Code Playgroud)
我写了这个函数并试图优化它,并希望它可以进一步优化.我经常使用它,有人知道如何让它更高效吗?