Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Por qué los programas en Delphi pesan tanto? (https://www.clubdelphi.com/foros/showthread.php?t=90549)

Al González 11-07-2016 04:45:01

Y considerar que los constructores y destructores de clase vienen a ser, para muchas nuevas bibliotecas, una mejor alternativa que las tradicionales secciones Initialization y Finalization. Estas últimas, opcionales al final de las unidades .pas, sí que hacen que el programa ejecutable pese y haga más cosas de las que vemos a simple vista.

Ojo, pues.

Delphius 11-07-2016 04:48:49

Cita:

Empezado por AgustinOrtu (Mensaje 506854)
La verdad no lo he probado. Realmente si elimino unidades del uses no es para ahorar kilobytes :D

Aun asi, hay que tener cuidado con las unit que tienen "initialziation" y "finalization". Yo en alguna unit se que uso un "viejo truco":

Código Delphi [-]initialization TAlgunaClase.ClassName // --> Boom! el compilador ya te linkeo la unit :)


Eso lo hago para registrar alguna cosa en algun lado, por ejemplo, como cuando se registran las clases de graficos (distintos formatos de imagenes) o lo mismo para archivos multimedia

Pues, si. Con esas units hay que cuidarse. Pero vuelvo a mis dichos: el compilador no es que te pone todo en el ejecutable. Sólo lo que necesita. Por ejemplo digamos que tienes una unit llamada UMisCosas y en dicha unit tienes cientos de procedimientos y funciones y algun par de clases. Esta unit es de propósito general, y ahora vas a usarla en una aplicación. La pones en uses, listo para usarla.
Ahora, sólo por ponerla, no hace nada (hagamos de cuenta que no hay inicialización ni finalización). Hagamos de cuenta que del centenar de procedimientos tienes contemplado usar apenas unas decenas. Justamente en la aplicación se incorporan solamente lo que se invoca.

Y el compilador es inteligente. Si no se usa nada, no lo pone. Lazarus es igual, aunque en esto es un poco más vivo: te informa de las unidades que no se están usando.

De todas formas, se puede hacer una "limpieza" al borrar los archivos temporales que genera Delphi y forzar de esa forma una nueva construcción.

Saludos,

AgustinOrtu 11-07-2016 05:01:42

Totalmente de acuerdo con lo que decis; pero vuelvo a remarcar que a mi no me interesa mucho el ahorro de bytes en el binario final sino el concepto (impacto que tiene en el diseño) el tener un uses que sobra

Cita:

Lazarus es igual, aunque en esto es un poco más vivo: te informa de las unidades que no se están usando.
Eso es sencillamente fantastico. En Delphi no tenemos algo asi?


Cita:

Y considerar que los constructores y destructores de clase vienen a ser, para muchas nuevas bibliotecas, una mejor alternativa que las tradicionales secciones Initialization y Finalization. Estas últimas, opcionales al final de las unidades .pas, sí que hacen que el programa ejecutable pese y haga más cosas de las que vemos a simple vista.
Si y no. Si la clase nunca se usa entonces el constructor de clase no se ejecuta. Por eso el truco del .ClassName :). Por supuesto que si el usuario usa la biblioteca todo marcha bien

Código Delphi [-]
unit Unit3;

interface

type
  TTestClassConstructor = class
  public
    class constructor Create;
    class destructor Destroy;
  end;

implementation

class constructor TTestClassConstructor.Create;
begin
  Writeln('TTestClassConstructor.Create');
end;

class destructor TTestClassConstructor.Destroy;
begin
  Writeln('TTestClassConstructor.Destroy');
end;

end.

Con un codigo de aplicacion de consola vacio (un simple Readln para que no se cierre), aunque este la unit3 en el uses, los constructor/destructor de clase no se ejecutan.

Pero, si hago esto si:

Código Delphi [-]
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Unit3 in 'Unit3.pas';

begin
  try
    TTestClassConstructor.ClassName;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Esto se ejecuta siempre

Código Delphi [-]
unit Unit3;

interface

implementation

initialization
  Writeln('initialization');

finalization
  Writeln('finalization');

end.

Al González 11-07-2016 05:24:18

Claro está, Agustín. Por eso en muchos casos resultan mejores los constructores y destructores de clase (quizá debí intentar explicarlo tan bien como tú). :)

Marcelo: interesante lo que hace Lazarus. Me pregunto por qué Delphi se ha demorado tanto en agregar algo tan útil (de forma nativa).

Saludos óptimos.

Delphius 11-07-2016 05:39:40

Lazarus lo informa por medio de un hint o warning... no recuerdo bien. Estoy en mi cama con el celular y durmiendome como para verlo ahora.
Lo que si puedo decir es que tal funcionalidad puede que venga de la mano con el hecho de que por defecto Lazarus almacena info de debug.
A medida que uno pone y saca cosas el ejecutable gana en tamaño, aún cuando hace linkeo inteligente se le queda basura y hay que borrarsela.
Para eso se le configura al poyecto y se indica que no genere debug info.

Delphi en esto es diferente. No se queda con la basura. Solo se queda con los ultimos cambios. Pueden ver esto en accion con la generacion de los archivos de compilacion temporales. Delphi detecta cuando cambia algo, y debe regerenarlos.

Desconozco por que no han puesto esta caracteristica, o si la pusieron tarde.

Saludos

Saludos

Al González 12-07-2016 05:49:23

Cita:

Empezado por Delphius (Mensaje 506865)
Estoy en mi cama con el celular y durmiendome...

Es curioso (y preocupante) lo frecuente de ese fenómeno. Yo tengo el mío apagado; lo encenderé de nuevo por la mañana, durante o después del desayuno. Y he comenzado cierto hábito de evitar introducir al dormitorio cualquier cosa que lleve un chip. A este paso pronto seré un cavernícola. :p

Delphius 12-07-2016 06:11:04

Eso deberíamos hacer todos Al.
Pero es difícil evitar la tentación.

Yo lo tengo por despertador y emergencias. Lo que si hago es dejarlo a una distancia prudenciable... cosa que al sonar la alarma me levante para apagarlo :D

Saludos, nuevamente con el celu y listo para dormir.

Casimiro Notevi 12-07-2016 09:28:00

Yo siempre lo apago, no quiero saber nada de emergencias, y menos todavía si la emergencia es a las 5 AM y algo así como: "Heriberto, que estamos esperándote abajo. Aquí no vive ningún Heriberto.

ecfisa 12-07-2016 16:00:38

Cita:

Empezado por damianccs (Mensaje 506791)
Hice un programa de 'hola mundo' en Delphi consola y pesa 1.163 KB, en Visual BASIC el hola mundo no pesa tanto. Eso me pasa en la versión de prueba de Delphi Berlin y en Lazarus. No sé si las aplicaciones visuales pesen así con Delphi. Saludos

¿ Que versión de Delphi ? Delphi 7 genera un programa consola "hola mundo" que pesa sólo 40 kb...



Saludos :)

Ñuño Martínez 12-07-2016 18:24:32

Cita:

Empezado por ecfisa (Mensaje 506921)
¿ Que versión de Delphi ? Delphi 7 genera un programa consola "hola mundo" que pesa sólo 40 kb...

Acabo de hacer la misma prueba con Free Pascal 3.0.0. Sin optimizar, 176'5Kib, optimizado, 26'3Kib. :cool:


La franja horaria es GMT +2. Ahora son las 18:59:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi