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.

Mostrar la cita
esta desarrollada
Mostrar la cita
rapido la verdad...
Mostrar la cita
#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.

Mostrar la cita
esta desarrollada
Mostrar la cita
rapido la verdad...
Mostrar la cita
#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:

Mostrar la cita
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
#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:

Mostrar la cita
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
#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
Ads by Google
Search Busqueda sugerida