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.
0 comentarios :
Publicar un comentario