#include <cstdio>
#include <Windows.h>
#include <atlbase.h>
#include <Tlhelp32.h>
#include <time.h>
//...........
int WINAPI findString(int lpmem,int memsize,int lpString,int StringSize,int AddrList)//; //
{
int nRet=-1;
__asm
{
pushad;
mov edx,lpmem;
add edx,memsize;
sub edx,StringSize;
mov edi,lpmem;
mov esi,lpString;
mov eax,[esi];
mov ecx,[esi+4];
mov ebx,AddrList;
LableBegin:
cmp eax,[edi];
jnz LableNext;
cmp ecx,[edi+4];
jnz LableNext;
mov ecx,StringSize;
push edi;
repz cmpsb;
pop edi;
mov esi,lpString;
mov ecx,[esi+4];
jnz LableNext;
LableSave:
mov ebx,edi;
add ebx,4;
LableNext:
inc edi;
cmp edi,edx;
jnz LableBegin;
LableRet:
mov nRet,ebx;
popad;
}
return nRet;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int SearchByteShuZu(byte * bForSearch,int ifLen, byte* bWaitSearch, int iwLen,int iFirstSearchPos)
{//int SearchByteShuZu(byte * bForSearch,int ifLen, byte* bWaitSearch, int iwLen,int iFirstSearchPos);//寻找字节集数组(待寻找的,待寻找的最大长度,要寻找的,要寻找的长度,起始寻找位置) 返回-1 为未找到 位置从0开始
int iCurrentPos=0;//待搜索位置
if (iFirstSearchPos>ifLen)//超过待搜索的长度
{
return -1;
}
if (iwLen>ifLen)//要搜索的长度比 待搜索的长度大 返回
{
return -1;
}
if (iwLen==0||ifLen==0)
{
return -1;//0 返回
}
// bForSearch+=iFirstSearchPos;//设置起始搜索位置
iCurrentPos+=iFirstSearchPos;//设置起始搜索位置
bForSearch+=iCurrentPos;//设置指针 对应
while(1)
{
while(*bForSearch!=*bWaitSearch)//找到第一个相同的
{
iCurrentPos+=1;//当前搜索位置前进1
bForSearch+=1;//当前指针前进1
if (iCurrentPos>ifLen) //长度超过待搜索的整体长度返回
{
return -1;
}
}
for (int i=0;i<iwLen;++i)//开始对比
{
if (*(bForSearch+i)!=*(bWaitSearch+i))
{
iCurrentPos+=1;//当前搜索位置前进1
bForSearch+=1;//当前指针前进1
//设置下指针前进1
break;//找到一个不同的 跳出
}
if (i+1==iwLen)
{
return iCurrentPos;//找到列
}
}
}
}
__int64 FileTimeToQuadWord(PFILETIME pft)
{
return Int64ShllMod32(pft->dwHighDateTime,32)|pft->dwLowDateTime;
}
__int64 GetThreadRunTime() //取线程当前占用cpu时间 单位:100ns(纳秒)
{
FILETIME ftKernelTime,ftUserTime,ftDummy;
GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,&ftKernelTime,&ftUserTime);
return FileTimeToQuadWord(&ftKernelTime)+FileTimeToQuadWord(&ftUserTime);
}
char szFind[0x20000000];
int main()
{
LPSTR szsea="45644564";
__int64 qwStartTime=0,qwTime=0;
qwStartTime=GetThreadRunTime();//setvalue
srand(time(NULL));
for (int i=0;i<sizeof(szFind)/sizeof(DWORD);i++)
{
((DWORD*)szFind)[i]=rand();
}
qwTime=GetThreadRunTime()-qwStartTime;
printf("/r/nSetValue:%I64d*100ns %dms/r/n",qwTime,qwTime/1000/10);
qwStartTime=GetThreadRunTime();
findString((int)szFind,sizeof(szFind),(int)szsea,8,0);
qwTime=GetThreadRunTime()-qwStartTime;
printf("/r/nfindString:%I64d*100ns %dms/r/n",qwTime,qwTime/1000/10);
qwStartTime=GetThreadRunTime();
SearchByteShuZu((byte*)szFind,sizeof(szFind),(byte*)szsea,8,0);
qwTime=GetThreadRunTime()-qwStartTime;
printf("/r/nSearchByteShuZu:%I64d*100ns %dms/r/n",qwTime,qwTime/1000/10);
return 0;
}
GetThreadTimes 获取的时间只是cpu执行时间 不包含睡眠时间及等待事件的时间
效率对比用
int memfind(const char *mem, const char *str, int sizem, int sizes)
{
int da,i,j;
if (sizes == 0) da = strlen(str);
else da = sizes;
for (i = 0; i < sizem; i++)
{
for (j = 0; j < da; j ++)
if (mem[i+j] != str[j]) break;
if (j == da) return i;
}
return -1;
}