Показать сообщение отдельно

  #53  
Старый 23.06.2009, 13:19
slesh
Познавший АНТИЧАТ
Регистрация: 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 раза больше по коду и следовательно по скорости.

Из этого можно сказать что при работе со строковыми функциями лучше использоват собственные методы
 
Ответить с цитированием