我用c写了一个插入排序法
然后我用汇编也写了一个插入排序法
因为我的汇编差 无法提高效率 我的汇编写发完全按高级语言的思路写出来的
之后反汇编c写的插入排序法 发现我的汇编代码和vc6.0生成的汇编代码完全一样可是 为什么我的汇编代码比c代码慢那么多 几十倍?
代码如下:请指教
#include "stdafx.h"
#include <windows.h>void insertsort(int *lparray,int nlength)
{
#define ASMSORT
#ifdef ASMSORT
typedef int SYMBOL; __asm
{ mov esi,lparray //保存 lparray的首地址
mov ecx,0 //初始化 i =0;
continue0: inc ecx //i++;
mov edx,ecx //j=i;
inc edx
mov ebx,dword ptr [esi + type SYMBOL * ecx] //tmp = *(lparray + i);
continue1:
dec edx //j--;
cmp ebx,dword ptr [esi + type SYMBOL * edx - type SYMBOL]/////////////////////////////////////
jg exit2 //if(tmp < *(lparray + j -1))
mov eax,dword ptr [esi + type SYMBOL * edx - type SYMBOL]
MOV dword ptr [esi + type SYMBOL * edx],eax //*(lparray + j) = *(lparray + j -1);
/////////////////////////////////////
cmp edx,0x0 //for(j=i; j>0; j--)
jg continue1 //if(j>0)goto continue1 (j--)
exit2:
mov dword ptr [esi + type SYMBOL * edx],ebx //*(lparray + j) = tmp;
cmp ecx,nlength //for(i=1; i<nlength; i++)
jl continue0 //if(i < nlength)goto continue0 (i++) }
#else
//*#########################################################################################
int i,j;
int tmp = 0;
for(i=1; i<nlength; i++)
{
tmp = *(lparray + i);
for(j=i; j>0; j--)
{
if(tmp < *(lparray + j -1))
*(lparray + j) = *(lparray + j -1);
else
break;
}
*(lparray + j) = tmp;
}
//#########################################################################################*/
#endif
}int main(int count, char* commands[])
{
const int n = 8000;
int number[n] = {5,9,8,6,7,1,3,0,2,4,5,9,8,6,7,1,3,0,2,4}; unsigned long timeed = GetTickCount();
insertsort(*&number,n);
printf("%d\n",GetTickCount() - timeed); printf("\n");
// for(int i=0; i<n; i++)
// printf("%d\n",number[i]); return 0;
}
然后我用汇编也写了一个插入排序法
因为我的汇编差 无法提高效率 我的汇编写发完全按高级语言的思路写出来的
之后反汇编c写的插入排序法 发现我的汇编代码和vc6.0生成的汇编代码完全一样可是 为什么我的汇编代码比c代码慢那么多 几十倍?
代码如下:请指教
#include "stdafx.h"
#include <windows.h>void insertsort(int *lparray,int nlength)
{
#define ASMSORT
#ifdef ASMSORT
typedef int SYMBOL; __asm
{ mov esi,lparray //保存 lparray的首地址
mov ecx,0 //初始化 i =0;
continue0: inc ecx //i++;
mov edx,ecx //j=i;
inc edx
mov ebx,dword ptr [esi + type SYMBOL * ecx] //tmp = *(lparray + i);
continue1:
dec edx //j--;
cmp ebx,dword ptr [esi + type SYMBOL * edx - type SYMBOL]/////////////////////////////////////
jg exit2 //if(tmp < *(lparray + j -1))
mov eax,dword ptr [esi + type SYMBOL * edx - type SYMBOL]
MOV dword ptr [esi + type SYMBOL * edx],eax //*(lparray + j) = *(lparray + j -1);
/////////////////////////////////////
cmp edx,0x0 //for(j=i; j>0; j--)
jg continue1 //if(j>0)goto continue1 (j--)
exit2:
mov dword ptr [esi + type SYMBOL * edx],ebx //*(lparray + j) = tmp;
cmp ecx,nlength //for(i=1; i<nlength; i++)
jl continue0 //if(i < nlength)goto continue0 (i++) }
#else
//*#########################################################################################
int i,j;
int tmp = 0;
for(i=1; i<nlength; i++)
{
tmp = *(lparray + i);
for(j=i; j>0; j--)
{
if(tmp < *(lparray + j -1))
*(lparray + j) = *(lparray + j -1);
else
break;
}
*(lparray + j) = tmp;
}
//#########################################################################################*/
#endif
}int main(int count, char* commands[])
{
const int n = 8000;
int number[n] = {5,9,8,6,7,1,3,0,2,4,5,9,8,6,7,1,3,0,2,4}; unsigned long timeed = GetTickCount();
insertsort(*&number,n);
printf("%d\n",GetTickCount() - timeed); printf("\n");
// for(int i=0; i<n; i++)
// printf("%d\n",number[i]); return 0;
}
解决方案 »
- 请教:为什么用ctrl+f5运行就不显示图片,直接运行exe就显示呢???
- 请教一下, 那些小网站靠什么赚钱?
- 为什么左边的控件无消息映射。
- 属性页标题标签的字体问题!求助
- 唉,一个C语言方面的基础问题,都忘记了。
- 如何在按纽上显示提示信息?在不同的按纽显示不同住信息?
- 一个菜鸟的问题
- >>>>>> 高分请教:关于在网页上启动SDI应用程序和数字签名的问题,会者不难
- c++ 读写图片 fread,fwrite
- 我用SetWindowLong函数子类化某个窗口,可消息接受函数怎么会捕捉不到WM_SIZE,WM_NOTIFY,WM_RBUTTONUP等消息?
- 请知情者指点:关于实现Rich Editl里的disabled属性的功能。 在线等,立结!
- DLL中封装网络通讯功能而不能实现,特地向全部程序员求教!(我问问题从来都是一百分,是知识就值这个数)
{ mov esi,lparray //保存 lparray的首地址
mov ecx,0 //初始化 i =0;
continue0:inc ecx //i++;
mov edx,ecx //j=i;
inc edx
//tmp = *(lparray + i);
mov ebx,dword ptr [esi + type SYMBOL * ecx]
continue1:
dec edx //j--;
cmp ebx,dword ptr [esi + type SYMBOL * edx - type SYMBOL]
jg exit2 //if(tmp < *(lparray + j -1))
mov eax,dword ptr [esi + type SYMBOL * edx - type SYMBOL]
MOV dword ptr [esi + type SYMBOL * edx],eax //*(lparray + j) = *(lparray + j -1);
cmp edx,0x0 //for(j=i; j>0; j--)
jg continue1 //if(j>0)goto continue1 (j--)
exit2:
dword ptr [esi + type SYMBOL * edx],ebx //*(lparray + j) = tmp;
cmp ecx,nlength //for(i=1; i<nlength; i++)
jl continue0 //if(i < nlength)goto continue0 (i++)
}
如果对性能要求很高,建议先看intel的3本手册,要是对处理器结构不了解,写出来的汇编代码还没有编译器来高效。写