读书人

两个程序性能比较有关问题!

发布时间: 2012-03-16 16:34:56 作者: rapoo

两个程序性能比较问题!急!!!
对给定的值target,顺序查找数组arr中与target相等的元素
两个算法:
1.
template <typename T>
int seqsearch1(const T arr[],int n,T & target)
{
for(int i=0;arr[i]!=target;i++)
{
if(i==n)
return -1; //查找失败
}
return i;
}

2.
template <typename T>
int seqsearch2(const T arr[],int n,T & target)
{
for(int i=n;i--;)
{
if(arr[i]==target)
return i;
}
return -1; //查找失败
}

请问一下哪个性能更高啊?还是一样?谢谢了~~~~~~

[解决办法]
一样.
[解决办法]
第一,你实测一下
第二,你需要多快?
[解决办法]
两个其实算法一样
[解决办法]
1 有问题,i的作用域是for内,离开for,i就没了
从算法上看,两个程序最差的情况下的循环次数和判断次数是一样的
[解决办法]
平均效率一样

#include "windows.h "
#include "stdio.h "


template <typename T>
int seqsearch1(const T arr[],int n,T & target)
{
int i;
for(i=0;arr[i]!=target;i++)
{
if(i==n)
return -1; //查找失败
}
return i;
}

template <typename T>
int seqsearch2(const T arr[],int n,T & target)
{
for(int i=n;i--;)
{
if(arr[i]==target)
return i;
}
return -1; //查找失败
}

void main() {

char str[] = "aafafjoquqonlajvfljafqioujljfaa ";
char c = 'v ';

DWORD s = 0;
DWORD d = 0;

int i = 1000000;
int r = 0;

s = GetTickCount();
while (i--)
r = seqsearch1(str, strlen(str), c);
d = GetTickCount();

printf( "%u\n ", d - s);

i = 1000000;
s = GetTickCount();
while (i--)
r = seqsearch2(str, strlen(str), c);
d = GetTickCount();

printf( "%u ", d - s);

}
[解决办法]
seqsearch1:Release的汇编码:
00401080 mov ecx,dword ptr [esp+0Ch]
00401084 mov edx,dword ptr [esp+4]
00401088 push ebx


00401089 xor eax,eax
0040108B mov cl,byte ptr [ecx]
0040108D mov bl,byte ptr [edx]
0040108F cmp bl,cl
00401091 push esi
00401092 je 004010AB
00401094 mov esi,dword ptr [esp+10h]
00401098 cmp eax,esi
0040109A je 004010A8
0040109C mov bl,byte ptr [eax+edx+1]
004010A0 inc eax
004010A1 cmp bl,cl
004010A3 jne 00401098
004010A5 pop esi
004010A6 pop ebx
004010A7 ret

seqsearch1:Release的汇编码:
004010B0 mov ecx,dword ptr [esp+8]
004010B4 test ecx,ecx
004010B6 push esi
004010B7 lea eax,[ecx-1]
004010BA je 004010D2
004010BC mov ecx,dword ptr [esp+10h]
004010C0 mov edx,dword ptr [esp+8]
004010C4 mov cl,byte ptr [ecx]
004010C6 cmp byte ptr [eax+edx],cl
004010C9 je 004010D5
004010CB mov esi,eax
004010CD dec eax
004010CE test esi,esi
004010D0 jne 004010C6
004010D2 or eax,0FFFFFFFFh
004010D5 pop esi
004010D6 ret

读书人网 >C++

热点推荐