为什么我的汇编代码要比C++代码慢10倍以上(同样功能的一个函数)

alphapaopao 2003-01-22 10:44:11
为什么我的汇编代码要比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
...全文
98 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphapaopao 2003-01-22
  • 打赏
  • 举报
回复
真是太感谢了。
请问大下能否给一个联系方法,日后可以请教。
clumsy 2003-01-22
  • 打赏
  • 举报
回复
fmul

fadd; 相加

fld epsilon; 和一个很小的常数进行比较判断
fmul epsilon
fcomp ; ** 应该是 fcompp
fstsw floatFlag

; 否则浮点堆栈不平衡, 大量的时间消耗在出错处理程序上了
; 我用BC4.5稍微修改了一下楼主的程序, c用时8秒左右, asm为3秒多
; 我的机子是C466
hs_guanqi 2003-01-22
  • 打赏
  • 举报
回复
因为你的C程序经过优化,实际上没有执行那个费时的循环!
而你调用那个汇编子程序,编译器无法进行优化。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧