Mejorar rendimiento de función memcpy

22/04/2005 - 12:24 por Josep Maria | Informe spam
Hola, estamos realizando un proceso que ejecuta copias de
bloques de memoria de un origen a un destino, con la
función memcpy.

Esta función dentro de nuestro proceso se llega a ejecutar
miles y miles de veces.

Si bien el tiempo de respuesta que obtenemos del proceso
es aceptable, queriamos saber si existe alguna función de
biblioteca C que mejore el rendimiento de esta función
memcpy, es decir, que haga a igual cantidad de bytes a
copiar de una zona de memoria a otra, lo haga más rapido.

Realmente, si lo encontramos mejoraría mucho el
rendimimento pues insisto, la función memcpy se está miles
y miles de veces en este proceso y una leve mejora en el
desempeño de esa función haría que globalmente tardase
mucho menos el proceso.

Gracias.

Preguntas similare

Leer las respuestas

#6 OK
22/04/2005 - 13:40 | Informe spam
Vale, es igual, muchas gracias de todas formas.

Vaya... memcpy no llama al API como yo pensaba, sino que


esta desarrollada
en ensamblador... no creo que se pueda hacer algo más


rapido la verdad...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


.

Respuesta Responder a este mensaje
#7 Josema
22/04/2005 - 20:00 | Informe spam
Tal vez deberíais repensar los algoritmos ¿no?


"OK" escribió en el mensaje
news:14b901c54730$0dc1bc90$
Vale, es igual, muchas gracias de todas formas.

Vaya... memcpy no llama al API como yo pensaba, sino que


esta desarrollada
en ensamblador... no creo que se pueda hacer algo más


rapido la verdad...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


.

Respuesta Responder a este mensaje
#8 Zephryn Xirdal
22/04/2005 - 20:46 | Informe spam
La función memcpy del Visual Studio 2003 utliza el típico bucle en C y
sólo en arquitectura x86:

while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}

Igonoro si el compilador genera mejor código para (que no debería hacerlo,
pero no se sabe)

while(count--) *(char *)dst++=+(char *)src++;

Lo que podrías probar es a ver el ensamblador que genera y buscar una
serie de instrucciones en ensamblador que fueran mejores. No sé qué código
generará el VC con lo de arriba, pero si no recuerdo mal, en ensamblador
debería ser:

mov ax,count
mov si,src
mov di,dst
repnz

Creo que es lo más corto, y si consigues pasar los parámetros ya en los
registros, mejor.

De todos modos, mi ensamblador de Intel x86 está más que oxidado.

Otra opción, mucho más difícil de desarrollar (y no sé si en un windows
puede ser posible), consistiriá en acceder al northbridge del chipset y
programarlo para que haga él mismo la transferencia directamente con la
memoria DDR (sé que se puede hacer, lo que no sé es cómo); pero aquí el
mayor problema sería la traducción que hace windows de dirección virtual a
física (y los movimientos para compactar y demás), pero supongo que de
alguna manera se podría controlar (de hecho, el propio windows -o lo que
acceda al hierro-, lo hace).


On Fri, 22 Apr 2005 20:00:10 +0200, Josema wrote:

Tal vez deberíais repensar los algoritmos ¿no?


"OK" escribió en el mensaje
news:14b901c54730$0dc1bc90$
Vale, es igual, muchas gracias de todas formas.

Vaya... memcpy no llama al API como yo pensaba, sino que


esta desarrollada
en ensamblador... no creo que se pueda hacer algo más


rapido la verdad...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


.










Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Respuesta Responder a este mensaje
#9 Zephryn Xirdal
22/04/2005 - 20:48 | Informe spam
Correcición. Donde dice:

while(count--) *(char *)dst++=+(char *)src++;

debe decir:

while(count--) *(char *)dst++=*(char *)src++;

On Fri, 22 Apr 2005 20:46:59 +0200, Zephryn Xirdal
wrote:

La función memcpy del Visual Studio 2003 utliza el típico bucle en C y
sólo en arquitectura x86:

while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}

Igonoro si el compilador genera mejor código para (que no debería
hacerlo, pero no se sabe)

while(count--) *(char *)dst++=+(char *)src++;

Lo que podrías probar es a ver el ensamblador que genera y buscar una
serie de instrucciones en ensamblador que fueran mejores. No sé qué
código generará el VC con lo de arriba, pero si no recuerdo mal, en
ensamblador debería ser:

mov ax,count
mov si,src
mov di,dst
repnz

Creo que es lo más corto, y si consigues pasar los parámetros ya en los
registros, mejor.

De todos modos, mi ensamblador de Intel x86 está más que oxidado.

Otra opción, mucho más difícil de desarrollar (y no sé si en un windows
puede ser posible), consistiriá en acceder al northbridge del chipset y
programarlo para que haga él mismo la transferencia directamente con la
memoria DDR (sé que se puede hacer, lo que no sé es cómo); pero aquí el
mayor problema sería la traducción que hace windows de dirección virtual
a física (y los movimientos para compactar y demás), pero supongo que de
alguna manera se podría controlar (de hecho, el propio windows -o lo que
acceda al hierro-, lo hace).


On Fri, 22 Apr 2005 20:00:10 +0200, Josema wrote:

Tal vez deberíais repensar los algoritmos ¿no?


"OK" escribió en el mensaje
news:14b901c54730$0dc1bc90$
Vale, es igual, muchas gracias de todas formas.

Vaya... memcpy no llama al API como yo pensaba, sino que


esta desarrollada
en ensamblador... no creo que se pueda hacer algo más


rapido la verdad...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


.















Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Respuesta Responder a este mensaje
#10 Rodrigo Corral [MVP]
23/04/2005 - 03:15 | Informe spam
El memcpy de C++ en la versión 7.1 y creo que en anteriores tambien esta
implementado integramente en ensamblador.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida