私は Java アプレットを開発しています。バイナリ コードのサイズを小さくすると、アプレットの起動が速くなり、ユーザー エクスペリエンスが向上します。
クラスおよび/またはjarファイルのサイズを縮小するためにできることはありますか? 明らかなトリックを見逃していないことを確認したい。
C++ の世界では、たとえばデバッグ シンボルを削除するためのコンパイラ オプションが大きな違いを生む可能性があることは知っていますが、Java でそのようなものを見たことはありません。
私は Java アプレットを開発しています。バイナリ コードのサイズを小さくすると、アプレットの起動が速くなり、ユーザー エクスペリエンスが向上します。
クラスおよび/またはjarファイルのサイズを縮小するためにできることはありますか? 明らかなトリックを見逃していないことを確認したい。
C++ の世界では、たとえばデバッグ シンボルを削除するためのコンパイラ オプションが大きな違いを生む可能性があることは知っていますが、Java でそのようなものを見たことはありません。
jar ファイルを小さくする方法に関するヒントについては、このページ ( http://wiki.java.net/bin/view/Games/4KGamesDesign ) を確認してください。絶対的な最小化を目指しているわけではないため、当てはまらないものもありますが、コードの品質を損なうことなく適用できる一般的なヒントがいくつかあります。
ここで要約します:
コードを 1 つのクラスに抑えます。各クラスは、JAR ファイル内のエントリのオーバーヘッドと、新しい定数プールおよびクラス リストを追加します。
メソッドを最小限に抑えます。各メソッドは、クラス ファイルにオーバーヘッドを追加します。必要なのはmain()
メソッドと、キーボードやマウスのルーチンを実装するメソッドだけです。
グローバル変数を使用しないでください。グローバル変数を識別するには、クラス内に特別なメタデータが必要です。ただし、メソッド ローカル変数は単なるスタック エントリであり、使用に追加の費用はかかりません。
7Zip や KZip などの優れた圧縮プログラムを使用して、JAR ファイルを作成します。JAR ユーティリティは、ほとんどの場合、圧縮率ではなく正確性のために設計されています。
ProGuard、JoGa、JShrink などの難読化ツールを使用して、クラスのサイズを最適化します。
クラス ファイル名には 1 文字を使用します。これにより、内部的にサイズが小さくなり、Zip プログラムが保存する情報の量が減り、マニフェストのサイズが小さくなります。
できるだけ少ないクラスを参照してください。参照する各クラスには、完全なパッケージとクラス名、および呼び出しているメソッド シグネチャが追加されます。
冗長性 (すべてのメソッド、クラス、およびフィールドに同じ名前を使用するなど) により、圧縮率が向上します。
private および final にされたメソッドは、クラス オプティマイザーによってインライン化できます。
メソッドを使用しString.valueOf()
て、プリミティブを文字列に変換します。たとえば、次のように""+number
展開されnew StringBuffer?().append("").append(number).toString()
ます。新しいクラスとメソッドの参照で大量のスペースを浪費します。
ソース コードで使用される静的な文字列、浮動小数点数、および整数は、定数プールに格納されます。その結果、静的な値を再利用できるほど、クラスは小さくなります。
定数の static final 変数を自由に使用できます。これにより、コードが読みやすくなり、ProGuard はこれを最適化して余分なオーバーヘッドが発生しないようにします。
使用できます
javac -g:none
デバッグ情報を削除するには - ただし、どれだけの違いが生じる可能性があるかはわかりません。
ダウンロード時間がボトルネックであるとどの程度確信していますか? アプレットの大きさは?巨大でない限り、ダウンロード後にサイズが大きく変わるとは思えません。
Proguardは、無料の Java クラス ファイル圧縮、最適化、難読化、および事前検証です。未使用のクラス、フィールド、メソッド、および属性を検出して削除します。バイトコードを最適化し、未使用の命令を削除します。
プロガード サイトのレポートには、19 ~ 90% の範囲で削減の例が示されています。
アプレットのサイズを改善するためのいくつかの提案:
難読化- Proguardは、私にとって全体的なパフォーマンスが最高で、25% 以上削減されました。さらに、ジャー中に適切な圧縮を提供します。
リソースを最適化する- 画像オプティマイザーを使用して添付画像を減らし、必要に応じて品質を下げます。
コードの変更- これをやりたくないのはわかりますが、Jar ファイルを調べて、生成されたクラスの数を確認する価値があります。最も単純なクラスのコストは約 500 バイトです。匿名の内部クラスがたくさんある場合は、リファクタリングする価値があるかもしれません。
必要に応じてリソースをロードする - 初期アプレットをロードします。開始後に追加のリソースを非同期でロードします。
Classdepandjarは Jini の世界で jar ファイルのサイズを縮小するために使用されます (Jini は多くのリモート コードを同梱しているため、この要件が必要です)。同じ jar 内から参照されていないクラスを削除します。
明らかにこれには例外 (名前でロードされるクラスなど) があるため、構成でこれらに対応できます。ほとんどの場合、関連する依存関係が残っていることを確認するために、「シェイクダウン」した jar に対してテストする必要があります。
pack200(およびgzip)は、jar(事実上zipファイル)よりもはるかに小さいファイルを生成します。
このツールを試してください。http://proguard.sourceforge.net/
私が知る限り、Java クラス ファイルからシンボルを削除することはできませんが、識別子を短くすることはできます。ただし、これによりスタック トレースが役に立たなくなる可能性があるため、推奨しません。
ただし、 AdvanceCOMP プロジェクトの改善された deflate アルゴリズムを使用して .jar ファイルを再圧縮することにより、ファイル サイズを無損失で縮小できます(.jar アーカイブは、内部の単なる .zip ファイルです)。
ツールを使用してコードの難読化を適用できます。これにより、多くの場合、変数とメソッドの名前が縮小され、クラスのサイズが大幅に縮小されます。これは、多くの場合、コードを J2ME プラットフォームにデプロイするときに行われます。
HTTP 圧縮は通常、JAR 圧縮よりも 50% ~ 80% の帯域幅しか消費しません。特に、Scala プログラムなど、多くのクラスを作成した場合は特にそうです。
NetBeans を使用する場合は、ビルド スクリプトを設定して、圧縮された JAR ファイルをプロジェクト構成 ([ビルド] > [パッケージ] の下) で生成できます。他のソリューションほど効果的ではないかもしれませんが、チェックボックスが 1 つしかありません。:-)