2009-11-24 15 views
12

Estoy desarrollando un Applet de Java, y la reducción del tamaño del código binario hará que el applet se abra más rápido y mejorará la experiencia del usuario.¿Qué puedo hacer para reducir el tamaño de las jar/classes?

¿Hay algo que pueda hacer para reducir el tamaño de las clases y/o archivos jar? Quiero asegurarme de no perderme trucos obvios.

Sé que en las opciones del compilador C++ world para, p. Ej. eliminar los símbolos de depuración puede marcar una gran diferencia, pero nunca he visto algo así para Java.

Respuesta

11

Puede utilizar

javac -g:none 

para eliminar la información de depuración - No sé cuánta diferencia es probable que sin embargo.

¿Qué tan convencido está de que el tiempo de descarga es el cuello de botella? ¿Qué tan grande es el applet? A menos que sea enorme, dudo que el tamaño haga mucha diferencia después de que se haya descargado.

+0

El applet es de 500k sin incluir las bibliotecas. No es lo único que afecta el tiempo de inicio, pero creo que es lo suficientemente significativo como para seguir investigando. – amarillion

0

Puede utilizar una herramienta para aplicar la ofuscación de código. Esto a menudo reducirá los nombres de variables y métodos y reducirá significativamente el tamaño de las clases. Esto a menudo se hace cuando se implementa código en la plataforma J2ME.

+0

¿Puede proporcionar el nombre de la herramienta? Gracias. – FaithReaper

6

Proguard es un archivo de clase Java shrinker, optimizer, ofuscador y preverificador. Detecta y elimina clases, campos, métodos y atributos no utilizados. Optimiza bytecode y elimina las instrucciones no utilizadas.

Los informes en el sitio proguard muestran ejemplos de la reducción, que van del 19 al 90%.

11

echa un vistazo a esta página para obtener algunos consejos sobre cómo puede hacer que sus archivos jar sean más pequeños - http://wiki.java.net/bin/view/Games/4KGamesDesign. Aunque es posible que algunos no se apliquen, ya que no está intentando la minimalización absoluta, existen algunos consejos generales que puede aplicar sin comprometer la calidad del código.

pero un resumen aquí:

Mantenga su código de abajo a una clase. Cada clase agrega la sobrecarga de una entrada en el archivo JAR, así como una nueva lista constante de grupos y clases.

Mantenga sus métodos al mínimo. Cada método agrega sobrecarga en el archivo de clase. Todo lo que debe necesitar es un método main() y métodos para implementar las rutinas del teclado y/o el mouse.

No utilice variables globales. Las variables globales requieren metadatos especiales en la clase para identificar. Las variables locales del método, sin embargo, son solo entradas de la pila y no cuestan nada adicional.

Utilice un buen compresor como 7Zip o KZip para crear sus archivos JAR. La utilidad JAR está diseñada principalmente para corrección, no para relaciones de compresión.

Use un ofuscador como ProGuard, JoGa o JShrink para optimizar el tamaño de su clase.

Use un solo carácter para el nombre del archivo de clase. Esto reduce su tamaño internamente, reduce la cantidad de información que almacena el programa Zip y reduce el tamaño del manifiesto.

Haga referencia al menor número de clases posible. Cada clase de referencia agrega el paquete completo y el nombre de clase, más la firma de método a la que llama.

La redundancia (como usar el mismo nombre para todos sus métodos y clases y campos) mejora las relaciones de compresión.

Los métodos creados como privados y finales pueden incluir un optimizador de clase.

Utilice el método String.valueOf() para convertir primitivas en cadenas. Por ejemplo, ""+number se expande a: new StringBuffer?().append("").append(number).toString() desperdiciando una gran cantidad de espacio en nuevas referencias de clases y métodos.

Las cadenas estáticas, los flotantes y los enteros utilizados en el código fuente se almacenan en el conjunto constante. Como resultado, cuanto más pueda reutilizar un valor estático, el menor será su clase.

Puede hacer un uso liberal de variables finales estáticas para constantes. Esto hará que su código sea más legible y ProGuard optimizará esto para que no haya gastos adicionales.

+0

Variables globales? Java no tiene estos. – uckelman

+1

Creo que Chii significa variables de miembros de nivel de clase –

+3

Esa es una lista muy detallada de cosas * que no se deben hacer, ni siquiera por el tamaño del archivo, a menos que sea solo para uso demostrativo. :) – Bombe

1

Por lo que puedo decir, no puede quitar símbolos de los archivos de clase de Java, pero puede acortar identificadores. Sin embargo, esto probablemente hará que los rastros de pila sean inútiles, así que no lo defiendo.

Sin embargo, puede reducir el tamaño del archivo sin pérdidas por volver a comprimir los archivos .jar utilizando algoritmos mejorados Deflate de los archivos .jar (AdvanceCOMP project son simplemente archivos .zip en el interior).

3

Classdepandjar se usa en el mundo de Jini para reducir el tamaño de los archivos jar (Jini ofrece una gran cantidad de código remoto, de ahí este requisito). Elimina las clases que no están referenciadas desde ese mismo contenedor.

Obviamente hay excepciones a esto (clases cargadas por nombre, etc.) y entonces puede acomodarlas en la configuración. Lo más probable es que pruebe contra su jar 'agitado' para determinar que las dependencias relevantes permanecen.

2

pack200 (y gzip) produce archivos mucho más pequeños que jarras (efectivamente archivos zip).

-1

Si usa NetBeans, puede configurar el script de compilación para generar un archivo JAR comprimido en la configuración del proyecto (en Build-> Packaging). Quizás no sea tan efectivo como otras soluciones, pero solo está a una casilla de verificación. :-)

3

Algunas sugerencias para mejorar el tamaño del applet:

  1. Ofuscación - Proguard fue el mejor para el rendimiento general para mí - más de 25% de reducción para mí. Además, proporcionará una compresión decente durante el Jar.

  2. Optimice cualquier recurso - reduzca las imágenes adjuntas utilizando optimizadores de imagen, calidad inferior si corresponde.

  3. Cambios en el código - Veo que realmente no desea hacer esto, pero vale la pena echarle un vistazo a sus archivos Jar y comprobar cuántas clases se producen. La clase más trivial costará alrededor de 500 bytes.Si tiene muchas clases internas anónimas, puede valer la pena refactorizar.

  4. Cargue los recursos necesarios - Cargue el applet inicial. Cargue recursos adicionales de forma asíncrona después de comenzar.

0
  1. desactivar la compresión al empaquetar un archivo JAR.
  2. Use la compresión HTTP para transmitir el archivo JAR.

La compresión HTTP generalmente solo consume un 50% -80% de ancho de banda que la compresión JAR, especialmente cuando creó muchas clases, p. un programa de Scala.

Cuestiones relacionadas