[mobile]Extraño problema que he solucionado

A ver este problema no está ligado a ningún juego ni ningúna aplicación de software gratuito. Esto lo me pasó mientras trabajaba.

Como muchos sabeis soy desarrollador de software para móbiles (a esperas de pasarme a microsoft...). Bueno el caso que os voy a contar me ha sucedido desde el pasado lunes hasta hoy martes dos dias... eso son 16 horas de trabajo.

Estoy desarroyando un software para un dispositivo windows CE el cual debe permitir navegar entre diferentes pantallas. Este software ha funcionado bien durante años para empresas pequeñas pero ahora me han pedido que lo modifique para una empresa más grande. El caso es que entre las diferentes ventanas se tratan como diferentes pasos y de una a otra se necesita la anterior.

El caso es que en los casos anteriores se cargaban entre 1000-2000 filas que se tenian que deserializar. Pero con mi nuevo proyecto eran 27.000. Esto es... muchas filas el caso es que bueno me ha salido un problema en el que al cargar las filas la primera vez cuesta 4 segundos... bueno una aplicación con interactividad... bueno 4 segudos... se podía espera pero aleatoriamente tenía parones... pero parones de la ostia xD (2 minutos) y luego seguía normal.

Además el código de deserializar no es mio y tenía que inverstigarlo...

El caso es que lo primero que he llegado a pensar en los siguientes casos

thread-> no puede ser, ya que estaban todos dormidos menos el de carga.
Memoria->de sobra 18 Mb y no bajaba (luego analizaremos más a fondo esto)
funciones internas de carga-> como se analiza la cadena para deserializar(ya que gasta un tokenizer) etc...
sistema operativo-> puede que el sistema operativo tenga la culpa...

en fin después de evaluar todo esto (casi un día de trabajo) NO TENíA ningún resultado... todas las pruebas eran contradictorias... los threads bien... memoria de sobra... las funciones del código eran simples.

El caso es que me ha dado por detenerme a observar el algoritmo de inserción. En el lo que se hacía es reservar un puntero dinámico de tipo objeto a deserializar, crear memoria por cada fila del fichero y deserializarla. En caso de cumplir cierta condición no se debe de cargar la fila. Entonces me he dado cuenta que este algoritmo estaba creando pequeñas secciones de memoria y destruyendolas. Por lo que al final he llegado a pensar que pese a no estar ocupando memoria estaba creando fragmentación y llegado cierto punto de fragmentación el sistema operativo toma las riendas y a partir de ahí reordena la memoria o hace lo que tenga que hacer se crea su lista de bloques vaciós adyacentes o algo y luego me sirve la memoria. Entonces en ese caso se suceden los cortes...

Bueno esta es mi teoría que pensais?

RESUMEN.
No es bueno crear y eliminar memoria dinámica en un bucle muy grande no solo por la memoria sino por el propio gestor del sistema operativo. O no?
creo que me he perdido en eso de "A ver si este problema..." jeje,es coña.Bonita teoria macrocientifica jeje(lo digo para alguien como yo)...pero interesante explicacion.
Saludos y gracias por la info
Pues tras haber leido todo lo que comentas parece ser lo mas posible dado que saltos...no van a ser por una programacion mas o menos depurada porque en tal caso lo que haria seria tardar mas de media y pista.
No es bueno crear y eliminar memoria dinámica en un bucle muy grande no solo por la memoria sino por el propio gestor del sistema operativo. O no?
Reservar memoria en un bucle es como leer los caracteres de un fichero de uno en uno ;).
Chano Marrano escribió: Reservar memoria en un bucle es como leer los caracteres de un fichero de uno en uno ;).

según lo que supongo creo que es incluso peor... xD ya que te cargas el sistema operativo.

A ver como comento esto lo he arreglado y tal ya. Pero quería comentarlo por si alguien que lo lee algún día le pasa algo parecido y dice anda... y si puede ser lo mismo... nunca se sabe.

Yo sabía que era malo reservar memoria y quitarla pero pensaba que no tendría ese nivel de impacto... como comento en algunos casos han llegado a ser 2 minutos!!.

Por cierto Cabe destacar un poco de tiempos jeje.

Con el apaño y un un poco más de inteligencia mejorando código he conseguido reducir el tiempo en el caso medio 1/4 y en he conseguido que desaparezca el caso extremo.

He pasado de 4000 mili segundos en el caso bueno a 1000 :) y supongo que a mi jefe que es más listo lo hubiese dejado en 50 milisegundos en 5 minutos xDDD

por último os animo a que cuando tengais alguna experiencia de este tipo la comenteis en el foro. Creo que no está ni mucho menos fuera de lugar aunque nos centremos en programación de consolas algo de programación general de recursos y demás.
Eso te pasa por usar C++ [qmparto]
Eso te pasa por usar guindous CE [jaja]
Me tocará explicarle a mi jefe que gaste otra cosa... xD no me haría caso.

ufff en serio tocar un programa con este tipo de bugs de memoria y peores.... me está quitando la vida xD

me llega una duda... que sería más difícil escribir el quijote? o ordenar las frases del quijote?
que sería más difícil escribir el quijote? o ordenar las frases del quijote?
Para el programador es mucho más fácil ordenarlo que escribirlo (un quicksort y listos). Para el ordena es otra historia [+risas].
Chano Marrano escribió: Para el programador es mucho más fácil ordenarlo que escribirlo (un quicksort y listos). Para el ordena es otra historia [+risas].


Pues no, porque El Quijote ya tiene las frases ordenadas [+risas]

El Quijote es una obra literaria, luego sus frases están escritas en un orden que por supuesto, no tiene que ver con ordenar alfabeticamente sus frases (cosa que no se ha especificado : P)
las implementaciones de malloc() que rulan por ahí hacen cosas de esas a veces, casi más propias de un recolector de basura que otra cosa.

Por eso en aplicaciones con uso intensivo de la memoria o con muchos hilos la gente se protege reservando al inicio un pool de memoria y pasando de malloc()
10 respuestas