none
Coste de crear y destruir clases RRS feed

  • Pregunta

  • Hola buenas, me gustaría si alguien me pudiera decir qué es más costoso para la cpu, crear y destruir constantemente clases en tiempo de ejecución o crear las clases en memoria y no destruirlas aunque haya un tramo de tiempo dentro del programa en el que no las utilices.

    Por poner un ejemplo si yo tengo una clase walk (andar), que se dedica a hacer que un personaje en un videojuego ande, cuando se ejecute otra acción como correr (que seria otra clase), seria mejor destruir la clase walk en tiempo de ejecución para liberar memoria ya que no se está utilizando, o dejarla en memoria.

    Como es una clase que se utilizaría constantemente pero tengo muchísimas clases distintas ocupando memoria, me gustaría saber si el hecho de instanciar y destruir clases en tiempo de ejecución tiene alto coste o no.

    Saludos y gracias de antemano.

    lunes, 8 de julio de 2013 16:07

Todas las respuestas

  • Depende totalmente de la clase, ¿cuanto se tarda en crearla-destruirla? ¿Cuánto se tarda en dormirla-despertarla?. Además debes de tener en cuenta que aunque no la destruyas, deberás crearte un gestor que gestione las clases 'dormidas' y que al 'despertarlas' las iniciánlice con los valores adecuados como si la hubieras creado de la nada. La única manera de saber que es lo más rápido en tu caso es que hagas pruebas exhaustivas cronometrando y controlando la memoria usada al crear-destruir  y en dormir-despertar y que obres en consecuencia. Cada clase es diferente, no hay reglas generales.

    Mi consejo es que las creas y destruyas con new y delete sin preocuparte de nada mas. Es mucho mas simple y te ahorrarás otra fuente de errores en el gestor de dormir-despertar clases. En el caso de que llegue el momento que notes que el rendimiento no es el adecuado, entonces estudia alguna otra solución. La solución puede ser no encontrar un método para dormir-despertar clases, si no en crear otra clase diferente: has pensado en crear la clase 'moverse' y ponerle un control de velocidad que le permita andar, correr, trotar, esprintar, deambular, remolonear... sin necesidad de tener una clase para cada cosa.

    lunes, 8 de julio de 2013 23:08
  • Si he pensado en hacer lo que indicas de crear una clase moverse, con diferentes funciones para cada tipo de desplazamiento. Pero para lo que quiero seria una clase demasiado grande.

    Realmente lo que estoy haciendo es un motor de animaciones para enlazar animaciones para un videojuego y tal como lo tengo pensado creo que la opción mas idónea era crear una clase por cada tipo de movimiento. Y cada clase a su vez contiene diferentes funciones para ejecutar las diferentes animaciones en función de la orientación.

    Así que en teoría el motor de animaciones va a tener muchas clases para cada tipo de movimiento y todas estas tienen que ser cargadas en memoria al ejecutar el programa. El tema es si me convendría crearlas y destruirlas en tiempo de ejecución según me vayan haciendo falta y así ocupar mucha menos memoria o dejarlas cargadas en memoria sacrificando el espacio que ocupan.

    Por definición ¿se sabe si unas clases medianamente grandes consumen muchos recursos para estar creardolas y destruirla en tiempo de ejecución constantemente? Por que sé que todas las clases del motor ocuparían bastante memoria pero no se qué costoso es para la maquina crear y destruir clases en tiempo de ejecución.

    Saludos y gracias de nuevo. 

    martes, 9 de julio de 2013 10:24
  • ¿Para ti que son recursos?

    ¿La memoria que gasta? simplemente haz un sizeof(andar) y sizeof(correr) y sabrás exactamente la memoria que necesitan.

    ¿El tiempo que tardan en crearse-destruirse? Depende de lo que tarde en SO en reservar la memoria necesaria y ejecutar el constructor. O ejecutar el destructor y liberar la memoria ocupada. Simplemente  haz una rutina de test que cree tropecientos objetos de la clases que está testeando y cronometra lo que tarda. después otra rutina que destruya los tropecientos objetos creados con la primera rutina y cronométralo también.

    Como te dije en la anterior respuesta, no hay reglas que digan que es lo mejor siempre. Cada clase es un caso particular y cada programador, en cada momento, puede considerar que se está gastando mucha o poca memoria o que se tarda demasiado o que ya va lo suficientemente rápido. Tendrás que hacer pruebas y tomar tus decisiones.

    Yo, cuando quiero comprobar cual de varias soluciones equivalentes es mejor en cuestiones de tiempo de ejecución, utilizo la función de Windows QueryPerformanceCounter para 'cronometrar' y tomar mi decisión para ese caso particular.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx

    martes, 9 de julio de 2013 22:57
  • Ok! muchas gracias.

    Saludos.

    miércoles, 10 de julio de 2013 15:03