为什么我的汇编代码要比C++代码慢10倍以上(同样功能的一个函数)
为什么我的汇编代码要比C++代码慢10倍以上
代码的功能是相同的,而且观察反汇编结果,我的汇编代码要比C++代码简洁得多。但是执行起来却是C++的代码快10倍以上。
感到十分不解。代码的目的是判断两个三维空间的点是否重合,也就是它们之间的距离是否足够的小。我想可能是我使用CPU
指令的时候不得要领。请问各位,为什么我的汇编代码居然会这么慢?
extern "C"
{
S2KMATH_EXPORT int32 ftPointCoincide(PNT3D *p1, PNT3D *p2);
}
SGeomTool::Test()
{
PNT3D p1(1.1223223455,2.1223466754,3.2134655322132), p2(4.35673212343,5.12354642,6.246743), p3(1,2,3);
LARGE_INTEGER t0, t1, f;
QueryPerformanceFrequency(&f);
int32 i, nCount = 0xffffff;
// 第一部分是C++的代码,计算两个点的距离是否足够的小。
QueryPerformanceCounter(&t0);
double d1, d2;
int32 nRet;
for(i=0; i<nCount; i++)
{
d1 = p1.x-p2.x;
d2 = d1*d1;
d1 = p1.y-p2.y;
d2 += d1*d1;
d1 = p1.z-p2.z;
d2 += d1*d1;
d2 = sqrt(d2);
nRet = d2<SVarSet::PT_COINCIDE; // 和一个非常小的常数进行比较
}
QueryPerformanceCounter(&t1);
TRACE("t = %lf\n", double(t1.QuadPart-t0.QuadPart)/double(f.QuadPart));
// 第二部分是调用汇编的代码,子过程是 ftPointCoincide
QueryPerformanceCounter(&t0);
for(i=0; i<nCount; i++)
ftPointCoincide(&p1, &p2);
QueryPerformanceCounter(&t1);
TRACE("t = %lf\n", double(t1.QuadPart-t0.QuadPart)/double(f.QuadPart));
}
PNT3D struc
x qword ?
y qword ?
z qword ?
PNT3D ends
.data
epsilon qword 1.0e-8
.code
ftPointCoincide proc p1:ptr PNT3D, p2: ptr PNT3D
local floatFlag:word
push ecx
push ebx
mov ebx, p1
mov ecx, p2
assume ebx: ptr PNT3D
assume ecx: ptr PNT3D
fld [ebx].x;一个坐标
fsub [ecx].x; 和另外一个坐标相减
fld st(0); 压栈,制造两个相同的数
fmul; 相乘,得到这个数的平方
fld [ebx].y; 另外一个分量,方法和上面的相同
fsub [ecx].y
fld st(0)
fmul
fadd; 相加
fld [ebx].z
fsub [ecx].z
fld st(0)
fmul
fadd; 相加
fld epsilon; 和一个很小的常数进行比较判断
fmul epsilon
fcomp
fstsw floatFlag
mov ax, floatFlag
sahf
pop ecx
pop ebx
jb return_one
mov eax, 0
ret
return_one:
mov eax, 1
ret
ftPointCoincide endp
end