
23.06.2009, 13:19
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами:
10097606
Репутация:
3349
|
|
Fata1ex в моё случае экономия времяни идет раза в 2 потому как strlen - проходит и сравнивате каждый символ с нулем. Так что если юзать strlen то это двойной проход строки. Для доказательства всег овышеслудующего приведу ассемблерный код который созддает компилятор MS
случай
Код:
int a = 0;
char * k = str;
while (k[0])
{
a += k[0];
k++;
}
Код:
; int a = 0;
xor edx, edx
mov BYTE PTR _str$[esp+10], cl
mov WORD PTR _str$[esp+8], ax
; char * k = str;
lea ecx, DWORD PTR _str$[esp+8]
; while (k[0])
test al, al
je SHORT $LN1@main
$LL2@main:
; a += k[0];
movsx eax, al
; 24 : k++;
inc ecx
add edx, eax
mov al, BYTE PTR [ecx]
test al, al
jne SHORT $LL2@main
$LN1@main:
Итого 31 байт.
А теперь рассмотрим код в случае
Код:
int k=0,A=0,n=strlen(str);
for(k=0;k<n;k++)
A+=str[k];
выходит
Код:
00024 8d 44 24 10 lea eax, DWORD PTR _str$[esp+20]
00028 83 c4 04 add esp, 4
0002b 88 4c 24 0e mov BYTE PTR _str$[esp+18], cl
0002f 33 db xor ebx, ebx
00031 8d 50 01 lea edx, DWORD PTR [eax+1]
$LL11@main: /// <== вот это типа код strlen==========
00034 8a 08 mov cl, BYTE PTR [eax]
00036 40 inc eax
00037 84 c9 test cl, cl
00039 75 f9 jne SHORT $LL11@main
/// <=========================================
0003b 2b c2 sub eax, edx
0003d 8b d0 mov edx, eax
; 23 :
; 24 : for(k=0;k<n;k++)
0003f 33 c0 xor eax, eax
00041 83 fa 02 cmp edx, 2
00044 7c 20 jl SHORT $LC9@main
00046 8d 4a ff lea ecx, DWORD PTR [edx-1]
00049 55 push ebp
0004a 8d 9b 00 00 00
00 npad 6
$LL10@main:
; 25 : A+=str[k];
00050 0f be 6c 04 10 movsx ebp, BYTE PTR _str$[esp+eax+20]
00055 03 f5 add esi, ebp
00057 0f be 6c 04 11 movsx ebp, BYTE PTR _str$[esp+eax+21]
0005c 83 c0 02 add eax, 2
0005f 03 fd add edi, ebp
00061 3b c1 cmp eax, ecx
00063 7c eb jl SHORT $LL10@main
00065 5d pop ebp
$LC9@main:
; 23 :
; 24 : for(k=0;k<n;k++)
00066 3b c2 cmp eax, edx
00068 7d 05 jge SHORT $LN8@main
; 25 : A+=str[k];
0006a 0f be 5c 04 0c movsx ebx, BYTE PTR _str$[esp+eax+16]
$LN8@main:
0006f 03 fe add edi, esi
выходит 77 байт.
что выходит почти в 2,5 раза больше по коду и следовательно по скорости.
Из этого можно сказать что при работе со строковыми функциями лучше использоват собственные методы
|
|
|