2009-04-29 18 views
5

En un momento tuve una pequeña y agradable utilidad de compresión que rompió mis EXE compilados de Delphi a un tamaño de descarga más pequeño, pero ahora no puedo encontrarlo. ¿Alguna recomendación?Delphi EXE compressor?

Además, ¿hay algún inconveniente en el uso de este tipo de utilidades? (Los uso principalmente para acortar los tiempos de descarga para usuarios de zonas rurales/de acceso telefónico).


pregunta relacionada: Are there any downsides to using UPX to compress a Windows executable?

+0

Eso está muy cerca de ser un duplicado - Agregué un enlace a la otra pregunta relevante en [delphi]. – mghie

Respuesta

13

Hace años analicé la compresión de mi ejecutable para hacer la descarga más pequeña.

Lo que terminé haciendo, y lo que recomiendo para usted, es utilizar un programa de instalación como Inno Setup en su lugar. No solo crea un único EXE que instalará/desinstalará su programa, sino que también comprime ese EXE prácticamente tanto como un compresor separado le haría a su ejecutable solo.

Cuando se instala el programa, se descomprime, por lo que nunca parece ser un virus y no aumenta los tiempos de carga.

Así que obtengo los beneficios de un tamaño de descarga más pequeño y un guión de instalación de aspecto profesional al mismo tiempo.

p.s. Inno Setup es gratis.

+4

+1 para la sugerencia de Inno Setup: incluye compresión de archivo desinflar, bzip2 y 7-Zip LZMA, por lo que son posibles instaladores muy pequeños. Brillará si hay archivos similares para comprimir, tengo una instalación donde el paquete ZIP es aproximadamente un tercio más grande que el archivo instalador (ambos contienen los mismos archivos). – mghie

4

No sé de cualquier que son específicamente para Delphi, pero UPX es muy popular para este tipo de cosas. El único inconveniente es que el ejecutable tiene que descomprimirse cuando se inicia, y eso puede consumir algo de tiempo. Sin embargo, parece ser muy rápido para los ejecutables de buen tamaño.

0

UPX debería funcionar, aunque no es específico de Delphi.

12

La recomendación es que no te:

  • compresores EXE pueden hacer que su aplicación parece como un virus (auto-modificable)
  • gzip/zip son igual de eficaz en la compresión y no jugar con su aplicación
  • compresores EXE hacer los tiempos de carga de su aumento de aplicación (a menos que estés hablando sólo el programa de instalación que es un asunto diferente

Este sitio de mirada loco trae a colación un argumento que escuché en el pasado distante (si es cierto o no, aún hoy, no estoy seguro, los empacadores modernos probablemente tengan una estrategia diferente hoy en día) ¡Este artículo hace referencia a Win32! :)

http://topic.csdn.net/t/20000408/08/6785.html

sistemas operativos multitarea modernos tales como Windows 95/98 y NT utilizan lo que se llama un sistema "memoria virtual". Cuando se inician los programas , todo el código es no cargado inmediatamente en la memoria al iniciarse, como fue el caso con los programas DOS . En cambio, solo las porciones de el código que se está ejecutando activamente son almacenados en la memoria. Por ejemplo, digamos su programa tiene una opción de Imprimir en su menú , y el código detrás de él que maneja la impresión de . Este código solo será cargado en la memoria una vez que la función Imprimir haya sido seleccionada por primera vez por el usuario. Y si después de que el código se carga en la memoria la función de impresión no se utiliza durante un tiempo el sistema se "descarta" el código, liberar la memoria ocupada que, si otra aplicación necesita desesperadamente memoria. Esta es la parte de un proceso llamado "paginación" y es completamente transparente para el programa.

Otra paginación manera bajo Win32 conserva la memoria es que causa múltiples instancias de un programa (o DLL) para comparten la misma memoria para el código.En otras palabras, en circunstancias normales no existe una diferencia real en la cantidad de memoria física asignada para el código entre comenzando 100 instancias de un programa y comenzando una instancia.

Si todos los programas de Win32 comportaban como programas de DOS, cargando todo en memoria y mantenerlo allí hasta que el programa terminado y tampoco compartir cualquier memoria entre múltiples casos, es probable que pueda imaginar la rapidez con la memoria física podría ejecute en sistemas con una cantidad limitada, , lo que hace que se inicie el intercambio de disco.

Sin embargo, esto es precisamente lo que los compresores Win32 EXE actuales hacen a su EXE's/DLL's! Van completamente contra el sistema de paginación del sistema operativo por descomprimir todo el código en la memoria y manteniéndolo allí hasta la terminación. Y como el código no está almacenado en un formato "en bruto" en el archivo EXE (es decir, el de la misma manera que se almacena en la memoria), el sistema operativo no puede compartir código entre instancias múltiples.

+2

Vea también: http://jrsoftware.org/striprlc.php#execomp –

+2

Un compañero de trabajo hizo algunas evaluaciones comparativas con y sin UPX. UPX terminó siendo una victoria para las cuotas de red y una pérdida para las unidades locales. Por supuesto, no puedo citar los números reales (no los recuerdo, y serían específicos de nuestro código), así que no dude en ignorarme :). –

+0

Jordan Russell (jrsoftware) es el desarrollador de Inno Setup, y el enlace al que se refiere Tim Sullivan en su comentario anterior es para el programa StripReloc de Jordan. Entonces, obviamente, Jordan es un experto en compresión y se podría suponer que lo hizo bien en Inno Setup. – lkessler

4

Probablemente está pensando en ASPack - es un compresor EXE escrito en Delphi, pero comprimirá cualquier EXE. Sin embargo, podría funcionar extra en Delphi EXE. Estoy de acuerdo con las otras respuestas de que no debe usar un compresor EXE solo para ahorrar en tiempos de descarga. Puede haber situaciones específicas en las que una compresión EXE sea una buena idea, pero generalmente no lo es.

En su lugar use un buen constructor de instalación, especialmente si puede encontrar uno que use la compresión 7zip. Sé que InstallAware usa 7zip internamente para una compresión máxima. Dependiendo de las versiones de Delphi que posea, es posible que también tenga una licencia de InstallAware.

Si nada más puedes construir un archivo autoextraíble con un comportamiento de instalación básico con 7zip gratis. Es una descarga separada para SFX para instaladores.

+2

Después de haber visto la instalación de Delphi 2007 en acción, no tocaría InstallAware con el proverbial poste de 10 pies. No puedo creer que usarlo no agregue más que la compresión del ejecutable se reduce en tamaño. – mghie

+4

Creo que Embarcadero debería haber usado innosetup para la configuración de Delphi. Recientemente tuve que hacer una configuración compleja que incluye SQL Server 2008, descargando el componente requerido durante la instalación. No podía creer lo genial que era Inno Setup, tan pronto como comencé. – Tom

+1

InnoSetup realmente es increíble y no podría recomendarlo más. He hecho una instalación muy simple con él. Nunca volvería a Wise/InstallShield, etc. ... – Nazar

1

Creo que los servidores de Terminal Server (como Citrix) usarán la misma memoria para su aplicación binaria si no está comprimida. Lo que significa que un exe comprimido podría oler un pequeño desastre en un entorno Citrix.

+1

Se llama 'memoria compartida' y se usa en casos de instancias múltiples de un EXE o DLL. No son solo los Servidores de Terminal que lo usan, sino todos los sistemas operativos modernos. La idea es simple Si la página de memoria virtual (4KB) ya existe, simplemente haga referencia a ella. Si un proceso individual cambia esa memoria, entonces la privatiza en un método conocido como copy-on-write. SIN EMBARGO, debe recordar que no todos los compresores ejecutables se comportan igual, y algunos pueden configurarse/predeterminados para omitir secciones compartidas. –

-1

Puede usar PECompact ya que las personas no pueden descifrarlo fácilmente, y como mostró la prueba (mostrada en la página principal, simplemente desplácese un poco hacia abajo) es mejor que ASPack o UPX, lo he usado en mis proyectos anteriores de Delphi

0

yo también votaría por upx. Además de las desventajas que se mencionaron, también protege de la ingeniería inversa básica y esas herramientas cojas de "recursos piratas informáticos". Que por cierto son muchos, y la mayoría de ellos no abren un ejecutable comprimido.

3

Uso UPX con la opción lzma para la compresión máx.

upx --lzma yourfile.exe 
2

El inconveniente principal de un archivo comprimido EXE o DLL es que el sistema operativo no puede compartir el código entre varias instancias.
Así que está desperdiciando memoria, tiene que descomprimir cada vez que inicia una instancia, exhibe un comportamiento similar al virus sin siquiera una ventaja de descarga sobre una instalación comprimida.
El caso positivo es solo cuando se inicia directamente desde una unidad de red.

+0

Sí, puede compartir código, pero depende de cómo esté empaquetado. La mayoría del código compartido está en DLL. PECompact ignora secciones compartidas de DLL de forma predeterminada, por ejemplo. Además, si no comprime sus archivos DLL, entonces la memoria compartida entre las instancias de proceso de esos archivos DLL no se ve afectada por la compresión de su EXE principal. –

Cuestiones relacionadas