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)

damianccs 07-07-2016 20:13:55

¿Por qué los programas en Delphi pesan tanto?
 
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

mamcx 07-07-2016 21:02:19

1.163 KB no es "pesar mucho".

La diferencia entre lenguajes esta en cuanto del codigo referencia dinamicamente y cuanto estaticamente. VB no "pesa" tanto porque depende de un runtime/librerias (.net) que es donde esta el "peso". Delphi por el contrario, incorpora el "runtime/librerias" estaticamente y por eso parece mas pesado.

damianccs 07-07-2016 21:15:06

Cita:

Empezado por mamcx (Mensaje 506796)
1.163 KB no es "pesar mucho".

La diferencia entre lenguajes esta en cuanto del codigo referencia dinamicamente y cuanto estaticamente. VB no "pesa" tanto porque depende de un runtime/librerias (.net) que es donde esta el "peso". Delphi por el contrario, incorpora el "runtime/librerias" estaticamente y por eso parece mas pesado.

Gracias, el peso de las aplicaciones es una de las características que estoy evaluando para elegir un nuevo lenguaje de programación. Si es así como dices entonces Delphi me sigue pareciendo el mejor. Saludos

rocksoft 07-07-2016 21:21:27

Buenas,

otro factor importante es envia ese ejecutable a alguien y funcionara, el de VB sino tiene todas las librerias que requiere no se podra ejecutar.

Reasen 07-07-2016 23:51:31

Cita:

Empezado por damianccs (Mensaje 506797)
Gracias, el peso de las aplicaciones es una de las características que estoy evaluando para elegir un nuevo lenguaje de programación. Si es así como dices entonces Delphi me sigue pareciendo el mejor. Saludos

Eso tiene muchas ventajas, una de ellas: no te tienes que estar preocupando tanto de las dependencias o librerías como suele pasar en el resto de lenguajes, queda todo mas compacto y cómodo :D, tienes a piñón de controles que tampoco requieren de librerías externas.

darkbits 08-07-2016 01:58:44

DX10.1 Berlin automáticamente adjunta skin Win10 o el Sistema operativo que estas utilizando por ello pesa así su ejecutable.
prueba en diferentes SO veras q se adapta a cada uno. en visualbasic si no lo colocas un skin la aplicación parece windows 98
yo tengo una aplicación DX10.1 que lo compila en 37Mb y utilizo compresor upx y lo comprime a 3.5Mb una belleza, y lo mejor el ejecutable no depende de OCX o DLL como VisualBasic.

Al González 08-07-2016 06:30:12

Bueno, bueno, bueno. ¿Tres de ustedes se han puesto de acuerdo, verdad? :p

Recordemos que... ;)

olbeup 08-07-2016 08:26:04

Por supuesto y a ojos cerrados, Delphi, Delphi, Delphi, Delphi, Delphi, Delphi, Delphi, Delphi, Delphi, Delphi, :D:D:D

avmm2004 08-07-2016 09:37:25

Cita:

Empezado por darkbits (Mensaje 506806)
DX10.1 Berlin automáticamente adjunta skin Win10 o el Sistema operativo que estas utilizando por ello pesa así su ejecutable.
prueba en diferentes SO veras q se adapta a cada uno. en visualbasic si no lo colocas un skin la aplicación parece windows 98
yo tengo una aplicación DX10.1 que lo compila en 37Mb y utilizo compresor upx y lo comprime a 3.5Mb una belleza, y lo mejor el ejecutable no depende de OCX o DLL como VisualBasic.

¿ El uso de compresores no ralentiza la carga del programa ? ¿ cual es ?

Gracias

Reasen 08-07-2016 12:19:33

Cita:

Empezado por avmm2004 (Mensaje 506812)
¿ El uso de compresores no ralentiza la carga del programa ? ¿ cual es ?

Gracias

Comprimir apenas se notaría en el inicio del mismo y luego el rendimiento sería igual que si estuviese o no comprimido.

dec 08-07-2016 14:06:51

Hola,

Cita:

Empezado por Reasen (Mensaje 506815)
Comprimir apenas se notaría en el inicio del mismo y luego el rendimiento sería igual que si estuviese o no comprimido.

Tampoco debemos olvidarnos que basta con distribuir nuestro ejecutable comprimido en formato Zip, o bien usando un programa como Inno Setup y alguno de los formatos de compresión disponibles, el archivo que distribuiremos será ya menor que el ejecutable propiamente dicho. Por ejemplo, uno de mis programas "pesa" cerca de 19 MB, pero, el instalador de dicho programa se reduce a unos 10 MB. De este modo nos ahorramos ese "apenas se notaría" del compresor, puesto que ya no usaríamos UPX o un compresor similar.

P.D. Si lo que se busca son archivos ejecutables realmente pequeños en Delphi, había por ahí un proyecto de nombre "KOL Magic Library" que existía al menos hasta para Delphi 7. Usando dichas librerías en lugar de la VCL de Delphi, los ejecutables obtenidos eran sorprendentemente pequeños.

darkbits 08-07-2016 16:27:33

avmm2004 Yo utilizo UPX hasta la fecha es bueno me comprime y no es lento la aplicación,

dec como comprimes en el ejecutable de 19Mb para q termina en algo menos? como lo haces con Inno Setup ? how to ...

dec 08-07-2016 18:56:48

Hola,

Cita:

Empezado por darkbits (Mensaje 506819)
avmm2004 Yo utilizo UPX hasta la fecha es bueno me comprime y no es lento la aplicación,

dec como comprimes en el ejecutable de 19Mb para q termina en algo menos? como lo haces con Inno Setup ? how to ...

En realidad creo que por defecto ya se usa algún tipo de compresión, pero, Inno Setup nos proporciona varias como puede verse aquí. La cosa es que incluso sin usar Inno Setup, simplemente, comprimiendo nuestro archivo ejecutable usando el formato Zip, ya obtendremos una reducción de peso del mismo.

TiammatMX 08-07-2016 19:42:27

Cita:

Empezado por damianccs (Mensaje 506791)
Hice un programa de 'hola mundo' en Delphi consola y pesa 1.163 KB...

Y según tú, ¿cuánto debería "pesar" (pésima aplicación de la palabra, como anotación personal)? Por que los míseros 156 caracteres que se usaron para escribir la instrucción, la forma (otros 20kB), las librerías añadidas, los ganchos para el sistema operativo, más un par de extras, nos dan con justa razón los 1.163 Kb (poco más de 1MB)..., y teniendo en cuenta que cualquier aplicación o PROGRAMA ronda los 20 ~ 25 MB promedio, lo tuyo por pequeño es despreciable, irrelevante...

¿O cuánto consideras que debería "pesar" el 'Hola, mundo!' más poderoso que hayas programado hasta el momento?

AgustinOrtu 08-07-2016 19:45:52

De todos modos, podes generar un ejecutable que no incluya todas las dependencias, y distribuir las dependencias y el binario final por separado; entonces quedaria un ejecutable notablemente mas chico pero que necesitará de los bpl / dll necesarios para poder funcionar. Busca por los foros carga dinamica de paquetes

rocksoft 08-07-2016 23:47:49

Y ya que estamos,

tambien suele ocurrir al hacer unos proyectos sobresimensionados como un HOla Mundo, cae uno en la tentacion de probar varios VLC, que al final no usamos y los borramos del diseño, pero no borramos la libreria de la unit y nos quedan uno residuos estupendos, como cuando usamos Jedi, Devexpres, que directamente te meten unas 10 units a escondidas :) y facilemten te pesa el hola mundo mas de 20 mb

AgustinOrtu 08-07-2016 23:56:08

Definitivamente. Igual, yo ya me acostumbré a eliminar todas las unit que no hacen falta, incluso si es una de las de Delphi estándar

damianccs 09-07-2016 15:30:04

Gracias por sus respuestas, el apoyo que se obtiene en las comunidades de desarrolladores en un lenguaje de programación también es un plus. Saludos

Delphius 11-07-2016 00:49:26

Cita:

Empezado por rocksoft (Mensaje 506826)
Y ya que estamos,

tambien suele ocurrir al hacer unos proyectos sobresimensionados como un HOla Mundo, cae uno en la tentacion de probar varios VLC, que al final no usamos y los borramos del diseño, pero no borramos la libreria de la unit y nos quedan uno residuos estupendos, como cuando usamos Jedi, Devexpres, que directamente te meten unas 10 units a escondidas :) y facilemten te pesa el hola mundo mas de 20 mb

Cita:

Empezado por AgustinOrtu (Mensaje 506827)
Definitivamente. Igual, yo ya me acostumbré a eliminar todas las unit que no hacen falta, incluso si es una de las de Delphi estándar

Ya antes he comentado que el compilador es bastante inteligente y sólo agrega al exe lo que requiera o usa. Que estén enlistadas en uses las units no lo hace al ejecutable final más pesado. Si de esas units no se usa ninguna clase, métodos, funciones, procedimientos, etc simplemente las ignora y no agrega nada al ejecutable.

Ese es el comportamiento por defecto desde D6 y D7 y debiera seguir siéndolo en las nuevas versiones.

Saludos,

AgustinOrtu 11-07-2016 03:22:01

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

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 20:42:00.

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