Avisos

Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 11/12/11, 22:54:21
Array

[xs_avatar]
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend

¿Cómo puede esta optimización ser mas lenta? (código en C)

Hola,

Para mi aplicación 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 la 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;
}

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:

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.
Responder Con Cita


  #2  
Viejo 12/12/11, 10:18:18
Array

[xs_avatar]
FordPrefect FordPrefect no está en línea
Usuario muy activo
 
Fecha de registro: jul 2010
Mensajes: 992
Modelo de smartphone: OnePlus 6
Tu operador: R Móvil
Hola,

La verdad es que suena raro.

No se si has escrito el código de memoria o lo has copiado y pegado pero tal como está, estás copiado el verde sobre el azul.

 Cita: Originalmente Escrito por bicho_visacoso Ver Mensaje
pixel_verde[c]=matriz_exposicion[pixel_verde[c]]; pixel_azul[c]=matriz_exposicion[pixel_verde[c]];
Lo peor es que esta corrección hara que sea incluso más lento :-(

La verdad es que no se me ocurre gran cosa:

- ¿Seguro que pixel_verde[] está declarado como int?
- ¿Has probado en otras tabletas?

Última edición por FordPrefect Día 12/12/11 a las 10:25:34.
Responder Con Cita
  #3  
Viejo 13/12/11, 13:01:19
Array

[xs_avatar]
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend

Hola, lo escribí de memoria, habría que modificar eso pero poco cambia la cosa...

Las matrices pixels son todas int, pero por si influye en algo son globales, la de exposición es local. ¿puede ser que tenga que declararla de otra forma o compilar con algún parámetro extra?.

Compilo desde la línea de comandos ejecutando ndk-build, no desde el eclipse...

Muchas gracias y un saludo.
David
Responder Con Cita
  #4  
Viejo 19/12/11, 16:45:26
Array

[xs_avatar]
LeiNaD_87 LeiNaD_87 no está en línea
Miembro del foro
 
Fecha de registro: nov 2010
Mensajes: 100
Modelo de smartphone: HTC Desire
Tu operador: Simyo
Me pierdo un poco como está la arquitectura de los moviles... pero, ¿estas teniendo en cuenta que en el segundo caso estás reservando memoria para 65k enteros?

Otra posible razón, es la localidad de los datos... en el primer caso les pixel_rojo y escribes en pixel_rojo ( sigue en caché ). En el segundo caso lees de un sitio y escribes en otro...

Este código aumenta aúm mas la localidad, pero dudo que sea más rápido:
Código:
for(c = 0; c<tamaño_foto; c++)
     pixel_rojo[c]=pixel_rojo[c]*exposicion;
for(c = 0; c<tamaño_foto; c++)
     pixel_verde[c]=pixel_verde[c]*exposicion;
for(c = 0; c<tamaño_foto; c++)
     pixel_azul[c]=pixel_azul[c]*exposicion;

Salu2!!
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 18:15:43 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /