domingo, 18 de noviembre de 2012

LP_memcmp. Fast memcmp: memcmp rápido en asm x86

Articulo íntimamente relacionado con el curso de ensamblador

Hola a todos,

La libreria stdlib.h de C da muchas funcionalidades con un rendimiento impresionante (memcmp y memcpy tiene una velocidad espectacular), pero incluso así son mejorables y en algunos casos las características de nuestro software nos obligan a optimizarlas.

La implementación del memcmp de C está hecha byte a byte por temas de compatibilidad con las diferentes plataformas existentes, pero realmente, si optimizamos para la plataforma x86 (que es de largo la más usada en los hogares de todo el mundo) podemos obtener grandes beneficios de usar 32 bits en vez de 8.

En nuestro caso concreto , los 32 bits se usan para poder comparar 4 bytes a la vez, reduciendo los accesos a memoria y el tiempo de cálculo. La interfície de parámetros es exactamente la misma que la que se usa para el memcmp de stdlib, así que podréis substituir rápidamente las llamadas para probar su funcionamiento.

Espero que os guste:



char LP_memcmp( const void * ptr1, const void * ptr2, size_t num )
{
__asm
{
mov ecx,num
mov esi,ptr1
mov edi,ptr2

test ecx,3
jz multiplo4

xor eax,eax
xor ebx,ebx

no_multiplo:
dec ecx
mov al,[esi]
mov bl,[edi]
inc esi
inc edi
cmp eax,ebx
jg mayor
jl menor

and ecx,ecx
jz igual

test ecx,3
jnz no_multiplo

multiplo4:
shr ecx,2
bucle:
mov eax,[esi]
mov ebx,[edi]

bswap eax
bswap ebx

add esi,4
add edi,4

cmp eax,ebx

jg mayor
jl menor
loop bucle

igual:
xor eax,eax
leave
ret
mayor:
mov eax,1
leave
ret

menor:
mov eax, -1
leave
ret
}
}



 La función ha sido probada para bastantes casos y parece que su funcionalidad es la correcta y el tiempo de ejecución es un 25% más rápido. 

Si este rendimiento no os es suficiente siempre podéis mirar el siguiente link para conseguir algo más de  rendimiento en vuestro memcmp

A ver si os animáis a probarla en vuestras aplicaciones y me contáis que mejora de velocidad observáis.

Nos vemos.

LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares