Hola,
Para mi aplicación Android estoy escribiendo código en C usando el NDK y me he encontrado con algo que me ha llamado la atención.
Tengo el siguiente código que aplica un aumento de exposición a una foto:
for(c = 0; c<tamaño_foto; c++){
pixel_rojo[c]=pixel_rojo[c]*exposicion; //exposición es un double que se recibe como parámetro
pixel_verde[c]=pixel_verde[c]*exposicion;
pixel_azul[c]=pixel_azul[c]*exposicion;
}
Es cutre, lo sé. pero...
El tamaño de la foto es un buffer de 1280x800, osea 3 millones de multiplicaciones entre int y double. Tarda unos 0,160 segundos en realizarse en mi tablet.
Intenté reducir el número de multiplicaciones con lo siguiente:
//Genero una LUT con todas las posibles multiplicaciones
int matriz_exposicion[65536]; //2^16 valores posibles de cada pixel
for(c=0;c<65536;c++){
matriz_exposicion[c]=c*exposicion;
}
for(c=0;c<tamaño_foto;c++){
pixel_rojo[c]=matriz_exposicion[pixel_rojo[c]];
pixel_verde[c]=matriz_exposicion[pixel_verde[c]];
pixel_azul[c]=matriz_exposicion[pixel_verde[c]];
}
Con este código se realizan solo 65536 multiplicaciones entre int y double y 3 millones de copias de datos desde matriz_exposicion a las matrices de pixel.
Pues este segundo código resulta que tarda 0,2 segundos en ejecutarse, un 25% más lento.
¿Puede ser que los procesadores ARM sean tan lentos copiando información o estoy haciendo algo mal?
Un saludo.
David.
Para mi aplicación Android estoy escribiendo código en C usando el NDK y me he encontrado con algo que me ha llamado la atención.
Tengo el siguiente código que aplica un aumento de exposición a una foto:
for(c = 0; c<tamaño_foto; c++){
pixel_rojo[c]=pixel_rojo[c]*exposicion; //exposición es un double que se recibe como parámetro
pixel_verde[c]=pixel_verde[c]*exposicion;
pixel_azul[c]=pixel_azul[c]*exposicion;
}
Es cutre, lo sé. pero...
El tamaño de la foto es un buffer de 1280x800, osea 3 millones de multiplicaciones entre int y double. Tarda unos 0,160 segundos en realizarse en mi tablet.
Intenté reducir el número de multiplicaciones con lo siguiente:
//Genero una LUT con todas las posibles multiplicaciones
int matriz_exposicion[65536]; //2^16 valores posibles de cada pixel
for(c=0;c<65536;c++){
matriz_exposicion[c]=c*exposicion;
}
for(c=0;c<tamaño_foto;c++){
pixel_rojo[c]=matriz_exposicion[pixel_rojo[c]];
pixel_verde[c]=matriz_exposicion[pixel_verde[c]];
pixel_azul[c]=matriz_exposicion[pixel_verde[c]];
}
Con este código se realizan solo 65536 multiplicaciones entre int y double y 3 millones de copias de datos desde matriz_exposicion a las matrices de pixel.
Pues este segundo código resulta que tarda 0,2 segundos en ejecutarse, un 25% más lento.
¿Puede ser que los procesadores ARM sean tan lentos copiando información o estoy haciendo algo mal?
Un saludo.
David.