Una planta de reciclaje de patrón en delphi
Los problemas del uso y la reutilización de muchos variando el tamaño de los objetos en una aplicación puede causar la fragmentación de la pila que puede ralentizar la velocidad de procesamiento. En este artículo se utiliza un objeto de fábrica, para hacer y reciclar los objetos con un mínimo de efectos de la fragmentación.
Uno de los patrones en el libro clásico de 'Patrones de Diseño de Elementos de Reusable Object-Oriented Software' es el método de fábrica, donde se crean los objetos y hace poco he tenido que usarlo. La razón? Un problema de la fragmentación de la memoria en un sistema de simulación utilizando un gran número de objetos para guardar matrices numéricas. Hubo varios numérico de la matriz de tipos, tamaños fijos que varían desde 1500 x 1 a 5000 x 10 números enteros o dobles. Estos fueron usados en la simulación de un cálculo financiero durante un período de dos años, la creación de datos en cada una de 472 simulado días a partir de datos históricos. Cada día, los datos se leen desde una base de datos, procesados, a continuación, guarda fuera.
a Pesar de una extensa pérdida de comprobación, el software solo por un número de simulación de días antes de comer hasta el archivo de intercambio de Windows. Pérdidas de memoria fueron cuidadosamente rastreado y eliminado, pero mi pelo todavía estaba en peligro. La aplicación no se ejecuta por más de unos 30 simulado días antes de que se hubiera cometido más de la mitad de la NT archivo de Paginación - esta en una de 512 Mb de ram del sistema! Cerrar la investigación puso de manifiesto que cada día se corrió, la memoria asignada creció de 5 a alrededor de 80 mb, a continuación, se encogen de nuevo a unos 5M de nuevo. En la cara de ella, no es un problema con 512 mb a jugar con el, pero viendo el Win NT Administrador de Tareas mostraron un aumento de la cantidad de memoria cometido.
la FRAGMENTACIÓN
El problema era simple, era la fragmentación del montón a la culpa. Esto ocurre cuando muchos objetos diferentes se han creado y destruido en varias ocasiones. Como cada objeto es creado, se consume la memoria del montón. Si los objetos se crea y se destruye a continuación, en orden inverso, probablemente no hubiera pasado, como todos los de la memoria liberada podría ser fusionados en un gran bloque. Pero, en cualquier sistema con un gran número de objetos de la orden de la creación y destrucción nunca será simétrica - mi app fácilmente puede tener hasta 50.000 objetos en la memoria al mismo tiempo. Así que cuando un objeto es destruido, un puntero a la memoria liberada bloque se añade a un bloque de la lista.
Cuando las demás peticiones de la memoria se hizo, Windows intenta asignar las solicitudes de la liberación de la primera lista. La fragmentación ocurre cuando un bloque grande como 1Mb ha sido solicitada y posteriormente liberado, seguido por una solicitud de un pequeño bloque. Esto se realiza desde el primer bloque en la lista que bien puede ser de 1 mb, lo que deja sólo a 900Kb libre. Luego de otra solicitud para una gran 1Mb bloque viene, no puede estar satisfecho de la lista libre y por lo que se toma del montón. Si la creación/destrucción de ciclo sucede bastantes veces los grandes bloques en el montón se cortan en trozos más pequeños de la ram física se agota y se reemplaza con una ram virtual. Windows montón de administración de memoria (y Delphi) es muy inteligente - se necesita mucho para llegar a fragmento. Pero bajo la presión implacable de un gran número de objetos que se crean y se destruyen, el administrador de memoria gradualmente la cueva.
Cuando Windows se ejecuta fuera de ram libre, se inicia el intercambio de páginas de la memoria ram en el disco y el rendimiento se lleva una nariz de buceo. Su aplicación podría ser galopando alegremente a lo largo de en el 100% de la CPU hasta que el intercambio se inicia. Entonces se convierte en un funeral de marzo arrastrándose a lo largo de tal vez un 7-10% de la CPU, teniendo siempre a ejecutar. Desastre!
Microsoft han puesto un montón de esfuerzo para hacer que el administrador de memoria tan eficiente como sea posible. Por ejemplo en el NT, hay un proceso de dos etapas de la reserva y de cometer la memoria. Si su aplicación requiere de 100 mb, es reservado cuando la aplicación se carga. Pero sólo cuando la memoria se accede son la reserva páginas cometido. Si quieres aprender más de lo que tú nunca posiblemente necesita saber acerca de este y otros temas, recomiendo el libro Dentro de NT, publicado por Microsoft Press pero el David Salomón versión que es la edición posterior, no el de Helen Custer primera edición.
PATRÓN de FÁBRICA
Así que necesitaba un no fragmentar la manera de crear muchos objetos, el uso de ellos, tirando de ellos y a continuación hacer todo de nuevo sin windows que se ejecuta fuera de la memoria virtual. Habiendo leído recientemente el libro de patrones pensé ¿por qué no usar una fábrica, es decir, un objeto de fábrica que crea objetos de una determinada clase. Luego fui uno mejor y de hecho el medio ambiente, por lo que se pone a la papelera de todos sus objetos fabricados en lugar de destruirlos y sin la asociada a la fragmentación de los problemas. La guinda del pastel fue a hacer la fábrica capaz de ampliar su capacidad, sin pérdida de velocidad de acceso.
en Vez de tener una clase de fábrica para todos los tipos de clase, tomé el enfoque más sencillo de pasar la clase de objeto en la fábrica como una fábrica de parámetros de creación. Cuando la fábrica se creó especifica la clase de objetos a los que se puede hacer y el inicial de la capacidad de almacenamiento de la fábrica. Este tamaño se puede cambiar hacia arriba llamando a la GrowFactory método. Le sugiero que sólo llaman a este excepcional (!) de las circunstancias.
El enlace de vuelta a la fábrica de cada uno de los objetos es necesaria, así que todos los 'fábrica de objetos' (FMOs) debe descender de un TFactoryObject clase en lugar de Tobject. Esto añade una fábrica de referencia que es 'impreso' en todos los FMOs de modo que el objeto sabe que la fábrica para el uso de reciclaje de sí mismo.
en Lugar de crear un objeto de su app solicita una adecuada fábrica llamando a su RequestObj método que devuelve un tclass objeto de convertir a la clase con el uso de 'como'. Finalmente, cuando haya terminado de usar el objeto que acaba de llamar a su RecycleSelf método. Ninguna creación o destrucción a excepción de las fábricas de sí mismos.
¿CÓMO FUNCIONA
Cuando la fábrica se crea, todos los objetos son físicamente creado en un bloque contiguo de memoria ram. Una de tlist (fblocklist) objeto contiene la dirección de cada uno de estos bloques. Cada vez que crezca la fábrica, se crea un nuevo bloque y se agregan a esta lista. El método AddObjects crea el número de objetos especificado el uso de la memoria ram desde el bloque. Si escribe un código como este ser conscientes de que sólo haciendo un tobject(dirección) no es suficiente para crear el objeto. Siempre debe llamar ObjectClass.InitInstance(dirección) para transformarlo en un objeto. InitInstance borra todo a cero, nil, etc, pero lo más importante es que establece el VMT.
La fábrica también contiene otro tlist (ffreelist) que contiene la dirección de cada objeto no utilizado.
Todos los de el burro de trabajo de llenado de la fábrica se realiza en el método privado AddObjects. Para cada objeto creado en el bloque, esto se convierte el puntero ptr en un objeto, utilizando FactoryObject como la clase de objeto creado. Esto siempre debe ser un descendiente de TfactoryObject. Obj contiene el objeto de referencia y enlaces de la fábrica para el objeto manufacturado. ptr luego se incrementa a punto para el siguiente objeto en el bloque mediante la adición de fsize.
Para obtener un objeto r código de llamadas Request_Obj que aparece la referencia fuera de la final de la ffreelist y devuelve el primer objeto solicitado. El reciclaje es el inverso empuja el reciclado de objetos de referencia en el extremo de ffreelist. Una cosa a tener en cuenta. Cuando una fábrica hecha objeto está en uso, la fábrica no tiene ninguna referencia a que, aunque la memoria ocupada por el objeto está contenido dentro de la fábrica!
SUSTITUCIÓN de CREAR Y DESTRUIR
el Uso de la fábrica requiere el uso de los objetos fabricados de forma ligeramente diferente de la normal. Usted no podrá crear o liberar explícitamente, en lugar de que usted acaba de solicitar la correspondiente fábrica para el objeto. A menos que la fábrica está vacía, esto siempre funciona. Tienes que modificar el código de inicialización del constructor y el código de terminación en el destructor de las rutinas. Hay dos enfoques.
1) Si el objeto tiene una simple crear un constructor sin parámetros, puede cambiarle el nombre a la inicialización del procedimiento anular y eliminar cualquier heredado crear las llamadas. La fábrica siempre se llama a un método Init cuando cualquier objeto que se solicita. Por defecto, este no hace nada, pero puede omitir este modo su Init será llamado automáticamente en cada objeto solicitado de la fábrica.
2) Si el original de crear tiene parámetros, cambie el nombre a algo como Inicializar y quitar heredado etc llamadas. Después de que el objeto se solicita llamar al iniciar la rutina, por ejemplo, la MyRoutine.Inicializar(...)
Si el objeto ha destructor código, cámbiele el nombre a Realizarse un procedimiento de invalidación de lo que es llamado automáticamente cuando el objeto es reciclado. Init y de Hecho son similares a crear/destruir, pero sin el equipaje de la construcción o destrucción mecanismo.
Como una ligera digresión, entiendo que hay argumentos en el Delphi mundo en favor de una parte de la creación o de dos partes, Una parte es donde el constructor tiene parámetros y completamente establece el objeto. En las dos parte de enfoque, el constructor crea un objeto en blanco que luego se inicializa por un método más tarde. El enfoque de fábrica creo firmemente en las dos partes del campamento..
Cuando la fábrica está destruido, todos los asignan bloques de memoria se libera. Antes de esto, la fábrica comprueba que el número de objetos en el freelist coincide con el de la capacidad. Si usted se ha olvidado de reciclar todo el resto de los objetos, se elevará una excepción.
PROGRAMA de COMPARACIÓN
Esto demuestra los beneficios de las fábricas.. En el trabajo de mi app había muchos tamaños diferentes de objetos en diferentes cantidades, pero una 15,000 línea de programa no es exactamente ser publicable. Después de un poco de ensayo y error que se me ocurrió un pequeño programa que puede mostrar la fragmentación. Sin embargo, esto depende del tamaño de los diferentes objetos, cuántos hay, la memoria ram disponible y por cuánto tiempo se ejecuta. También, la fragmentación parece ocurrir más rápidamente en NT4.0 del 98 que sugiere que quizás 98 tiene un mejor administrador de memoria. Cuando se ejecuta crea y destruye un gran número de objetos repetidamente por el número de días especificado. También se hace exactamente la misma cosa que el uso de una fábrica. Cada día es el tiempo de espera y ambos conjuntos de veces que se representa con Tchart.
he utilizado tres tipos de objetos, todos descendientes de tTestobj que desciende de Tfactoryobject. Los objetos pequeños son de 2 kb de tamaño, de tamaño medio son de 40K y grandes son 800K, pero estos tamaños son definidos por las constantes y pueden cambiar fácilmente. El programa de demostración asigna 100Mb para los objetos normales y otro de 100 mb para la fábrica. Ambos contienen el mismo número de objetos - igualmente divididos por tamaño entre los tres tipos de objetos por lo que hay 17406 objetos pequeños, 873 medio y 43 grandes. En el objeto del procedimiento de creación de TimeOneDay estos son al azar creado y añadido a la lista. Al final del día ellos son liberados y el proceso se repite al día siguiente.
de La misma se hace mediante tres fábricas con todos los objetos fabricados añadido a un factorydata lista. En un P2 400 con 256 mb de 100 días, hubo un aumento modesto en el tiempo, tanto en la fábrica y el normal de creación de objetos. Comentario de la normal creación confirmó esta sospecha - el aumento fue mucho menos más de un 1000 días usando las fábricas contra 100 días con la normal y pruebas en fábrica. Yo supuse que esto fue causado por el aumento de intercambio de páginas debido a la fragmentación que afectan tanto a los procesos. Otras combinaciones de tamaños y el número de objetos en Windows 98 no mostró la fragmentación
he implementado esta usando originalmente un tlist tanto testdata y factorydata y la cambió más tarde cuando me di cuenta de que en repetidas ocasiones la adición y la liberación de 18000 punteros se añade también a la fragmentación del montón. No estoy abogando por amaraje tstringlists completamente en el código son muy útiles (como se tlists), pero si tiene que manipular un gran número de elementos, puede ser mejor utilizar a su propia lista de las estructuras. Si desea utilizar Tlist o Tstringlist para este propósito, probablemente lo mejor para llenar completamente la estructura con nil punteros, por lo que cuenta = capacidad y el uso de un número entero para mantener el índice de la última puntero.
Esta aplicación también confirmó que el código de fábrica es muy rápido en la asignación y eliminación - normalmente de 30 ms de 18000 objetos en lugar de los 870 ms que los normales de la creación/eliminación tomó.
& & & & & & & & & & & & & & & & & & & & & & & &
Tgis artículo apareció originalmente en Delphi Developer magazine. Sources.zip
Una planta de reciclaje de patron en delphi
Una planta de reciclaje de patron en delphi : Multi-millones de consejos para hacer su vida mas facil.
Los problemas del uso y la reutilizacion de muchos variando el tamaño de los objetos en una aplicacion puede causar la fragmentacion de la pila que puede ralentizar la velocidad de procesamiento. En este articulo se utiliza un objeto de fabrica, para hacer y reciclar los objetos con un minimo de efectos de la fragmentacion.
Uno de los patrones en el libro clasico de 'Patrones de Diseño de Elementos de Reusable Object-Oriented Software' es el metodo de fabrica, donde se crean los objetos y hace poco he tenido que usarlo. La razon? Un problema de la fragmentacion de la memoria en un sistema de simulacion utilizando un gran numero de objetos para guardar matrices numericas. Hubo varios numerico de la matriz de tipos, tamaños fijos que varian desde 1500 x 1 a 5000 x 10 numeros enteros o dobles. Estos fueron usados en la simulacion de un calculo financiero durante un periodo de dos años, la creacion de datos en cada una de 472 simulado dias a partir de datos historicos. Cada dia, los datos se leen desde una base de datos, procesados, a continuacion, guarda fuera.
a Pesar de una extensa perdida de comprobacion, el software solo por un numero de simulacion de dias antes de comer hasta el archivo de intercambio de Windows. Perdidas de memoria fueron cuidadosamente rastreado y eliminado, pero mi pelo todavia estaba en peligro. La aplicacion no se ejecuta por mas de unos 30 simulado dias antes de que se hubiera cometido mas de la mitad de la NT archivo de Paginacion - esta en una de 512 Mb de ram del sistema! Cerrar la investigacion puso de manifiesto que cada dia se corrio, la memoria asignada crecio de 5 a alrededor de 80 mb, a continuacion, se encogen de nuevo a unos 5M de nuevo. En la cara de ella, no es un problema con 512 mb a jugar con el, pero viendo el Win NT Administrador de Tareas mostraron un aumento de la cantidad de memoria cometido.
la FRAGMENTACION
El problema era simple, era la fragmentacion del monton a la culpa. Esto ocurre cuando muchos objetos diferentes se han creado y destruido en varias ocasiones. Como cada objeto es creado, se consume la memoria del monton. Si los objetos se crea y se destruye a continuacion, en orden inverso, probablemente no hubiera pasado, como todos los de la memoria liberada podria ser fusionados en un gran bloque. Pero, en cualquier sistema con un gran numero de objetos de la orden de la creacion y destruccion nunca sera simetrica - mi app facilmente puede tener hasta 50.000 objetos en la memoria al mismo tiempo. Asi que cuando un objeto es destruido, un puntero a la memoria liberada bloque se añade a un bloque de la lista.
Cuando las demas peticiones de la memoria se hizo, Windows intenta asignar las solicitudes de la liberacion de la primera lista. La fragmentacion ocurre cuando un bloque grande como 1Mb ha sido solicitada y posteriormente liberado, seguido por una solicitud de un pequeño bloque. Esto se realiza desde el primer bloque en la lista que bien puede ser de 1 mb, lo que deja solo a 900Kb libre. Luego de otra solicitud para una gran 1Mb bloque viene, no puede estar satisfecho de la lista libre y por lo que se toma del monton. Si la creacion/destruccion de ciclo sucede bastantes veces los grandes bloques en el monton se cortan en trozos mas pequeños de la ram fisica se agota y se reemplaza con una ram virtual. Windows monton de administracion de memoria (y Delphi) es muy inteligente - se necesita mucho para llegar a fragmento. Pero bajo la presion implacable de un gran numero de objetos que se crean y se destruyen, el administrador de memoria gradualmente la cueva.
Cuando Windows se ejecuta fuera de ram libre, se inicia el intercambio de paginas de la memoria ram en el disco y el rendimiento se lleva una nariz de buceo. Su aplicacion podria ser galopando alegremente a lo largo de en el 100% de la CPU hasta que el intercambio se inicia. Entonces se convierte en un funeral de marzo arrastrandose a lo largo de tal vez un 7-10% de la CPU, teniendo siempre a ejecutar. Desastre!
Microsoft han puesto un monton de esfuerzo para hacer que el administrador de memoria tan eficiente como sea posible. Por ejemplo en el NT, hay un proceso de dos etapas de la reserva y de cometer la memoria. Si su aplicacion requiere de 100 mb, es reservado cuando la aplicacion se carga. Pero solo cuando la memoria se accede son la reserva paginas cometido. Si quieres aprender mas de lo que tu nunca posiblemente necesita saber acerca de este y otros temas, recomiendo el libro Dentro de NT, publicado por Microsoft Press pero el David Salomon version que es la edicion posterior, no el de Helen Custer primera edicion.
PATRON de FABRICA
Asi que necesitaba un no fragmentar la manera de crear muchos objetos, el uso de ellos, tirando de ellos y a continuacion hacer todo de nuevo sin windows que se ejecuta fuera de la memoria virtual. Habiendo leido recientemente el libro de patrones pense ¿por que no usar una fabrica, es decir, un objeto de fabrica que crea objetos de una determinada clase. Luego fui uno mejor y de hecho el medio ambiente, por lo que se pone a la papelera de todos sus objetos fabricados en lugar de destruirlos y sin la asociada a la fragmentacion de los problemas. La guinda del pastel fue a hacer la fabrica capaz de ampliar su capacidad, sin perdida de velocidad de acceso.
en Vez de tener una clase de fabrica para todos los tipos de clase, tome el enfoque mas sencillo de pasar la clase de objeto en la fabrica como una fabrica de parametros de creacion. Cuando la fabrica se creo especifica la clase de objetos a los que se puede hacer y el inicial de la capacidad de almacenamiento de la fabrica. Este tamaño se puede cambiar hacia arriba llamando a la GrowFactory metodo. Le sugiero que solo llaman a este excepcional (!) de las circunstancias.
El enlace de vuelta a la fabrica de cada uno de los objetos es necesaria, asi que todos los 'fabrica de objetos' (FMOs) debe descender de un TFactoryObject clase en lugar de Tobject. Esto añade una fabrica de referencia que es 'impreso' en todos los FMOs de modo que el objeto sabe que la fabrica para el uso de reciclaje de si mismo.
en Lugar de crear un objeto de su app solicita una adecuada fabrica llamando a su RequestObj metodo que devuelve un tclass objeto de convertir a la clase con el uso de 'como'. Finalmente, cuando haya terminado de usar el objeto que acaba de llamar a su RecycleSelf metodo. Ninguna creacion o destruccion a excepcion de las fabricas de si mismos.
¿COMO FUNCIONA
Cuando la fabrica se crea, todos los objetos son fisicamente creado en un bloque contiguo de memoria ram. Una de tlist (fblocklist) objeto contiene la direccion de cada uno de estos bloques. Cada vez que crezca la fabrica, se crea un nuevo bloque y se agregan a esta lista. El metodo AddObjects crea el numero de objetos especificado el uso de la memoria ram desde el bloque. Si escribe un codigo como este ser conscientes de que solo haciendo un tobject(direccion) no es suficiente para crear el objeto. Siempre debe llamar ObjectClass.InitInstance(direccion) para transformarlo en un objeto. InitInstance borra todo a cero, nil, etc, pero lo mas importante es que establece el VMT.
La fabrica tambien contiene otro tlist (ffreelist) que contiene la direccion de cada objeto no utilizado.
Todos los de el burro de trabajo de llenado de la fabrica se realiza en el metodo privado AddObjects. Para cada objeto creado en el bloque, esto se convierte el puntero ptr en un objeto, utilizando FactoryObject como la clase de objeto creado. Esto siempre debe ser un descendiente de TfactoryObject. Obj contiene el objeto de referencia y enlaces de la fabrica para el objeto manufacturado. ptr luego se incrementa a punto para el siguiente objeto en el bloque mediante la adicion de fsize.
Para obtener un objeto r codigo de llamadas Request_Obj que aparece la referencia fuera de la final de la ffreelist y devuelve el primer objeto solicitado. El reciclaje es el inverso empuja el reciclado de objetos de referencia en el extremo de ffreelist. Una cosa a tener en cuenta. Cuando una fabrica hecha objeto esta en uso, la fabrica no tiene ninguna referencia a que, aunque la memoria ocupada por el objeto esta contenido dentro de la fabrica!
SUSTITUCION de CREAR Y DESTRUIR
el Uso de la fabrica requiere el uso de los objetos fabricados de forma ligeramente diferente de la normal. Usted no podra crear o liberar explicitamente, en lugar de que usted acaba de solicitar la correspondiente fabrica para el objeto. A menos que la fabrica esta vacia, esto siempre funciona. Tienes que modificar el codigo de inicializacion del constructor y el codigo de terminacion en el destructor de las rutinas. Hay dos enfoques.
1) Si el objeto tiene una simple crear un constructor sin parametros, puede cambiarle el nombre a la inicializacion del procedimiento anular y eliminar cualquier heredado crear las llamadas. La fabrica siempre se llama a un metodo Init cuando cualquier objeto que se solicita. Por defecto, este no hace nada, pero puede omitir este modo su Init sera llamado automaticamente en cada objeto solicitado de la fabrica.
2) Si el original de crear tiene parametros, cambie el nombre a algo como Inicializar y quitar heredado etc llamadas. Despues de que el objeto se solicita llamar al iniciar la rutina, por ejemplo, la MyRoutine.Inicializar(...)
Si el objeto ha destructor codigo, cambiele el nombre a Realizarse un procedimiento de invalidacion de lo que es llamado automaticamente cuando el objeto es reciclado. Init y de Hecho son similares a crear/destruir, pero sin el equipaje de la construccion o destruccion mecanismo.
Como una ligera digresion, entiendo que hay argumentos en el Delphi mundo en favor de una parte de la creacion o de dos partes, Una parte es donde el constructor tiene parametros y completamente establece el objeto. En las dos parte de enfoque, el constructor crea un objeto en blanco que luego se inicializa por un metodo mas tarde. El enfoque de fabrica creo firmemente en las dos partes del campamento..
Cuando la fabrica esta destruido, todos los asignan bloques de memoria se libera. Antes de esto, la fabrica comprueba que el numero de objetos en el freelist coincide con el de la capacidad. Si usted se ha olvidado de reciclar todo el resto de los objetos, se elevara una excepcion.
PROGRAMA de COMPARACION
Esto demuestra los beneficios de las fabricas.. En el trabajo de mi app habia muchos tamaños diferentes de objetos en diferentes cantidades, pero una 15,000 linea de programa no es exactamente ser publicable. Despues de un poco de ensayo y error que se me ocurrio un pequeño programa que puede mostrar la fragmentacion. Sin embargo, esto depende del tamaño de los diferentes objetos, cuantos hay, la memoria ram disponible y por cuanto tiempo se ejecuta. Tambien, la fragmentacion parece ocurrir mas rapidamente en NT4.0 del 98 que sugiere que quizas 98 tiene un mejor administrador de memoria. Cuando se ejecuta crea y destruye un gran numero de objetos repetidamente por el numero de dias especificado. Tambien se hace exactamente la misma cosa que el uso de una fabrica. Cada dia es el tiempo de espera y ambos conjuntos de veces que se representa con Tchart.
he utilizado tres tipos de objetos, todos descendientes de tTestobj que desciende de Tfactoryobject. Los objetos pequeños son de 2 kb de tamaño, de tamaño medio son de 40K y grandes son 800K, pero estos tamaños son definidos por las constantes y pueden cambiar facilmente. El programa de demostracion asigna 100Mb para los objetos normales y otro de 100 mb para la fabrica. Ambos contienen el mismo numero de objetos - igualmente divididos por tamaño entre los tres tipos de objetos por lo que hay 17406 objetos pequeños, 873 medio y 43 grandes. En el objeto del procedimiento de creacion de TimeOneDay estos son al azar creado y añadido a la lista. Al final del dia ellos son liberados y el proceso se repite al dia siguiente.
de La misma se hace mediante tres fabricas con todos los objetos fabricados añadido a un factorydata lista. En un P2 400 con 256 mb de 100 dias, hubo un aumento modesto en el tiempo, tanto en la fabrica y el normal de creacion de objetos. Comentario de la normal creacion confirmo esta sospecha - el aumento fue mucho menos mas de un 1000 dias usando las fabricas contra 100 dias con la normal y pruebas en fabrica. Yo supuse que esto fue causado por el aumento de intercambio de paginas debido a la fragmentacion que afectan tanto a los procesos. Otras combinaciones de tamaños y el numero de objetos en Windows 98 no mostro la fragmentacion
he implementado esta usando originalmente un tlist tanto testdata y factorydata y la cambio mas tarde cuando me di cuenta de que en repetidas ocasiones la adicion y la liberacion de 18000 punteros se añade tambien a la fragmentacion del monton. No estoy abogando por amaraje tstringlists completamente en el codigo son muy utiles (como se tlists), pero si tiene que manipular un gran numero de elementos, puede ser mejor utilizar a su propia lista de las estructuras. Si desea utilizar Tlist o Tstringlist para este proposito, probablemente lo mejor para llenar completamente la estructura con nil punteros, por lo que cuenta = capacidad y el uso de un numero entero para mantener el indice de la ultima puntero.
Esta aplicacion tambien confirmo que el codigo de fabrica es muy rapido en la asignacion y eliminacion - normalmente de 30 ms de 18000 objetos en lugar de los 870 ms que los normales de la creacion/eliminacion tomo.
& & & & & & & & & & & & & & & & & & & & & & & &
Tgis articulo aparecio originalmente en Delphi Developer magazine. Sources.zip
Una planta de reciclaje de patrón en delphi
By Consejos Y Trucos
Una planta de reciclaje de patrón en delphi : Multi-millones de consejos para hacer su vida más fácil.