Hola a todos.
Es mas rapido trabajar con int8 que con int16 (*)
Difiero contigo Pedro, en este caso trabajar con int16 para el llenado de la matriz es más rapido que utilizando int8. Y aun mejor, trabajar con int32 es todavia más rápido y dado que ocupamos la misma cantidad de memoria en los 3 casos, un 13 % del 18F2525 para ser más exactos, una mayor demanda de RAM no es un factor limitante para no trabajar apuntando a 2 registros o 4 (para el caso de int32) al mismo tiempo.
Obviamente, antes de tirar semejante refutación (y mas ha alguien con tu reputación Pedro) y no quedar en verguenza me he tomado el trabajo de comprobar que mi comentario realmente es válido. A continuación presento como de costumbre las ventanas de mplab que exponen tanto el código como el tiempo que demoro en ejecutarse el llenado de la matriz de 4096 elementos con punteros apuntando a 1, 2 y 4 registros a la vez, en ese orden.
Este es el caso expuesto por Palitroquez y como ya sabemos da casi 2 milisegundos. Ahora veamos cuando llenamos de a dos registros simultaneamente:
Vemos que el tiempo que demora en ejecutar todo es un poco mas de un milisegundo, fijense que la variable [A] ya no se incrementa 512 veces sino 256, por eso divido por dos el tamaño de la matriz. Veamos si utilizo un llenado de 4 registros simultaneamente:
Observen que el tiempo que tarda en llenar la matriz es de tan solo 647 microsegundos!!!!!. Es casi tan bajo como el tiempo obtenido por memset. Aqui tal como pueden deducir, el bucle de llenado solo se realiza 128 veces.
De estos tres casos se pueden sacar conclusiones interesantes. Primero, y tal como lo ha dicho Palitroquez, implementar un bucle origina demoras y cuanto mas ciclos debe realizar el bucle mas tarda en ejecutarse obviamente. Por eso cuantos mas registros llenamos a la vez menos cantidad de veces tenemos que realizar el bucle y por lo tanto menos tiempo demoramos.
Ahora bien, no es tan sencilla la cuestión, pues aunque para la matriz del ejemplo trabajar con un puntero en int8, int 16 o int32 nos supone solo un cambio de definicion del tipo de datos, no todas las matrices con las que trabajemos tendran un tamaño tan "adecuado" por decirlo de algun modo (Una matriz de 512 bytes es una ganga pues es multiplo de 1, 2 y 4 bytes) y por lo tanto si intentamos trabajamos con int32 en algunos casos nos encontraremos que nos faltan completar registros o bien que nos pasamos de dirección. Lo mismo puede ocurrir con int16 y una matriz, por ejemplo, que ocupa un numero de registros impares. La aplicación de estos metodos dependen mucho del tipo de dato que contiene la matriz y del tamaño de la misma. Por lo tanto yo creo que aqui el metodo con memset se lleva todos los premios y que los otros metodos son aplicables cuando el tiempo no es un factor crítico o bien vienen a titulo informativo.
Ahora me voy a dormir, veo punteros por todos lados.
Saludos desde Argentina.