PDA

Ver la Versión Completa : Como saber que units uso realmente¿?


Sirkius
04-09-2005, 17:57:39
Hola, pues el tema está en que sigo siendo muy novato en Delphi y en el unico proyecto que hecho (para el negocio familiar..) he usado muchos componentes diferentes para pruebas. Pues me doy cuenta de que el exe pesa 5Mb y borrando algunos units de la lista de uses pues se ha reducido, pero hay otros que se ven a simple vista si lo estoy utilizando o no (el nombre no canta tanto).

Hay alguna manera de saber que units estoy realmente usando ya sea con componentes o con funciones para poder borrar el resto?

Muchas gracias por leer esta parrafada (si no escribo tanto no me explico muy bien :P)

dec
04-09-2005, 18:49:37
Hola,

Más novato soy yo Sirkius, verás cómo lo hago: Cuando inicio un nuevo proyecto, o añado un nuevo formulario a uno en que esté trabajando, quito todas las unidades, excepto la unidad "Forms". A partir de ahí se van añadiendo unidades, según van haciendo falta: algunas las añade Delphi automáticamente, otras las añade el que te escribe de digitalmente, o sea, con los dedos y el teclado. ;)

Creo que (si no es así corregidme, por favor), de todos modos, el que se añadan unidades no aumenta de tamaño un proyecto, pues el compilador/optimizador, se encarga de compilar y enlazar en el ejecutable únicamente las que son precisas, incluso no el total de la unidad precisa, pero solamente lo que se utilize de la misma.

Cuando alguna vez me he topado con el problema que planteas, lo que he hecho ha sido quitar todas las unidades (acaso no las que evidentemente esté usando) a lo bruto, para acto seguido pulsar "CTRL+S", para guardar el archivo en cuestión, de forma que Delphi automáticamente añada las unidades que son menester.

¿Que obtengo algún error de compilación? Como será (en este caso) por faltar alguna unidad, me fijo en la que es precisa y la añado, sencillamente. No sé si habrá otra forma mejor de hacer las cosas, o más rápida o más efectiva, pero, te he referido cómo lo hago puesto en el caso que tú.

jmariano
05-09-2005, 01:27:45
Saludos!

A parte de lo dicho por dec, te recomiendo una herramienta llamada "Icarus" que te permitirá, entre otras cosas, coseguir lo que quieres. (Se trata de una herramienta que analiza el código fuente y te dice aquello que puedes "eliminar" para conseguir un ejecutable mas pequeño). Lo puedes conseguir en: http://www.peganza.com/products.htm

Sirkius
05-09-2005, 12:21:17
Ok, muchas gracias a los dos. Mucho me temia que al final hacia falta un poco de trabajo a mano.., pero voy a probar el icarus antes de ponerme a ver si funciona bien.

Saludos.

PD: yo tambien creia que el compilador/linkador seria inteligente, pero no. Quitando cosas del uses se ha ido reduciendo el tamaño...

delphi.com.ar
05-09-2005, 14:31:46
PD: yo tambien creia que el compilador/linkador seria inteligente, pero no. Quitando cosas del uses se ha ido reduciendo el tamaño...
Quita el fragmentos de código, funciones, procedimientos y declaraciones no utilizadas. Pero no las units (Ejecuta siempre todos los initializations), ni los recursos de estas units que suele ser lo pesado del asunto.

Saludos!

dec
05-09-2005, 17:35:15
Hola,


PD: yo tambien creia que el compilador/linkador seria inteligente, pero no. Quitando cosas del uses se ha ido reduciendo el tamaño...
Veamos los resultados de una sencilla prueba:

Nuevo proyecto en Delphi 7:


uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms, Dialogs;

Tamaño del ejecutable: 364 KB (372.736 bytes).

El mismo proyecto, pero, con la única unidad necesaria:


uses
Forms;

Tamaño del ejecutable: 364 KB (372.736 bytes).

delphi.com.ar
05-09-2005, 17:51:50
¡Me cambiaste el mensaje!
Pero como te escribí una prueba para el anterior, te la voy a subir:


program Project1;

uses
DB,
Dialogs;

begin
ShowMessage('Hola Mundo!');
end.

El código es sencillo, estamos utilizando "de mas" la unit DB. Activa la opción "Use Debugs DCUs" (Project\Options\Compiler), pone un BreakPoint en el initialization de la unit DB, ejecuta tu aplicación y..... Woalá!
Como verás en ese initialization se utiliza un TDefaultDBScreenApplication, por consiguiente se va a requerir el código de TDefaultDBScreenApplication y el código que este utilice. (Si ves el caso de Forms verás que el alcance puede ser algo mayor)

Saludos!

delphi.com.ar
05-09-2005, 17:55:21
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms, Dialogs;

Tamaño del ejecutable: 364 KB (372.736 bytes).

El mismo proyecto, pero, con la única unidad necesaria:


uses
Forms;

Tamaño del ejecutable: 364 KB (372.736 bytes).
En este ejemplo faltaría ver la implementación... ¿Escribiste código debajo?
De ser así, si utilisaste la clase TForm, por ejemplo, este caso es diferente a lo que comenté en el hilo anterior. El tema aquí es que la unit Forms y el código de sus clases principales, utilizan todas las units que nombraste anteriormente. Por eso no notas diferencia en este ejemplo sencillo.

dec
05-09-2005, 18:18:53
Hola,

A ver, a ver, que me estoy haciendo un lío... ¿Pues no que he visto tu último mensaje antes que el penúltimo que enviaste? ¿A qué se deberá esto? Y luego encima leo:


¡Me cambiaste el mensaje!
¡Pero si yo no hize nada! Estaba preparándote la respuesta a tu último mensaje cuando, al hacer una vista previa de la misma, veo que hay publicado un nuevo mensaje tuyo... ¡antes del que yo pensaba responder!

Ahora, tratando de responder a tu último mensaje...


En este ejemplo faltaría ver la implementación... ¿Escribiste código debajo?
De ser así, si utilisaste la clase TForm, por ejemplo, este caso es diferente a lo que comenté en el hilo anterior.
No; se trata de un proyecto "vacío", recién creado, con un solo formulario, vaya, la plantilla que te prepara Delphi para que comienzes con el mismo.


El tema aquí es que la unit Forms y el código de sus clases principales, utilizan todas las units que nombraste anteriormente. Por eso no notas diferencia en este ejemplo sencillo.
Bien pudiera ser. Pero, entonces, que me quede claro, que quizás por aquí debí haber comenzado y dejar las pruebas para quien sepa hacerlas en condiciones... Si yo no hago uso de la unidad "Dialogs" en una unidad cualquiera, pero, sin embargo, la unidad "Dialogs" está en alguna de las cláusulas "Uses" de dicha unidad, ¿Será añadida la unidad "Dialogs" al ejecutable de la aplicación de marras? ¿para qué? ¿con qué motivo?

Comprendo que puedo no hacer uso de la unidad "Dialogs" en la unidad en que se incluya, pero que dicha unidad "Dialogs" puede ser necesaria en otra unidad del proyecto, y, claro está, en este caso sería preciso añadir el código de la unidad "Dialogs", pero, no siendo esto así, ¿se añadiría la unidad "Dialogs" al ejecutable? Vuelvo a preguntarme, ¿para qué? ¿con qué motivo?

Y yendo un poco más lejos aún: ¿Se añadirá todo el código de la unidad "Dialogs" o solamente el código de las funciones, procedimientos, clases, en fin, todo el código de dicha unidad o solamente lo que estrictamente es necesario? Dudas de lunes tarde... ;)

delphi.com.ar
05-09-2005, 20:02:26
No; se trata de un proyecto "vacío", recién creado, con un solo formulario, vaya, la plantilla que te prepara Delphi para que comienzes con el mismo.
Al tratarse de un proyecto vacío, siempre son iguales por lo que expliqué anteriormente de la dependencia de las Units.

Si yo no hago uso de la unidad "Dialogs" en una unidad cualquiera, pero, sin embargo, la unidad "Dialogs" está en alguna de las cláusulas "Uses" de dicha unidad, ¿Será añadida la unidad "Dialogs" al ejecutable de la aplicación de marras? ¿para qué? ¿con qué motivo?

Si no haces uso de ninguna función / clase / declaración, solo se incluirá el código del initialization y finalization (implícito o explícito) de la unit. Como dije anteriormente, si o casualidad, el initialization o finalization utilizan funciones / clases / declaraciones de la unit en cuestión, o de otra unit, entonces el compilador se verá obligado a incluirlas a no ser que ese código pueda ser optimizado.

Y yendo un poco más lejos aún: ¿Se añadirá todo el código de la unidad "Dialogs" o solamente el código de las funciones, procedimientos, clases, en fin, todo el código de dicha unidad o solamente lo que estrictamente es necesario? Dudas de lunes tarde...
En lo que respecta al código, solo agregará las funciones, procedimientos y clases que son "necesitadas" por tu código, y por el código de las cláusulas initialization y finalization. Ademas agregará los recursos de la unit al recurso de la aplicación (Ese es uno de los problemas de usar la unit Forms, porque utiliza controls y controls tiene Controls.res). Con respecto a las variables globales, solo son dimensionadas si el código compilado las utiliza, ya sea tu código o el de las units.

Saludos!

dec
06-09-2005, 10:17:45
Hola,

Queda la cuestión más clara. Muchas gracias, como siempre, Federico. ;)

Sirkius
06-09-2005, 10:34:33
Pues si. Mucho mas claro, no conocia lo de initialization, ahora ya todo tiene sentido... se inicialia de forma oculta y se incluye al menos una parte del unit...

PD: ahora a ver como lo borro, porque en el icarus solo analiza un archivo cada vez y muuuuuuy despacio.

dec
06-09-2005, 10:58:05
Hola,


(...) en el icarus solo analiza un archivo cada vez y muuuuuuy despacio.

Acaso estés analizando archivos ".pas", o sea unidades, por separado, pero, el programa Icarus (http://www.peganza.com/products.htm) puede analizar directamente archivos de proyecto ".dpr" con todo lo que esto conlleve. En lo de rápido o despacio no me meto... únicamente diré que lo descargé después de que jmariano diera noticia del mismo y el programa analizó más de 600.000 líneas de un proyecto dado en menos de un minuto. Dependerá también, pienso ahora, de la computadora, claro está: procesador, memoria RAM, en fin, esas cosillas ;)