web-dev-qa-db-ja.com

実行可能ファイル(Delphi)のサイズを小さくするにはどうすればよいですか?

Delphi 2009を使用して、デスクトッププログラム用の単一の実行可能ファイル(.EXE)をリリースします。プログラムの実行に必要な外部DLLまたはリソースがありません。

私は2つのコンポーネントを使用します: LMD InnovativeのELPackSergey TkachenkoのTRichView これらは実行可能ファイルにコンパイルされます。

「リリース」ビルド構成を使用して本番バージョンをビルドすると、生成される実行可能ファイルは13,533KBです。

Delphi 2009を使用する前は、Delphi 4を使用していました。生成された実行可能ファイルは、同じ2つのコンポーネントを組み込み、基本的に現在のバージョンと同じコードを使用しながら、わずか2,671KBでした。

Delphi 2009が完全にUnicodeであり(これが私がアップグレードした主な理由です)、Unicodeであるとサイズが最大2倍になる可能性があることを私は理解しています。しかし、これは約5倍大きいです。

実行可能ファイルを5倍大きくしなければならない理由はありますか?または、実行可能サイズのかなりの部分を削減する簡単な方法はありますか?


ご注意ください。一部の人々はDelphiEXEを圧縮する方法で答えています。それは私がやろうとしていることではありません。必要のないものを削除するために、なぜこれほど多くのスペースが使用されているのかを簡単に確認しようとしています。それが行われた場合でも、必要に応じて後で圧縮を行うことができます。

インストールされた実行可能ファイルの大きさは、実際にはどれほど大きくても小さくてもかまいません。これはダウンロードを目的としており、圧縮するサーバーの負荷とダウンロード時間を最小限に抑えるためのものです。 Inno Setup を使用して、インストールルーチン自体の中でプログラムを圧縮することを好みます。その後、インストールするとフルサイズに拡大されます。これにより、ウイルスとして検出される可能性がなくなり、メモリ内のプログラムを解凍するために必要な余分な起動時間がなくなります。また、実行可能ファイルとインストールルーチンの両方にコード署名を行っていますが、一部の圧縮技術はそれと互換性がありません。

圧縮の詳細については、StackOverflowの質問を参照してください: Delphi EXEコンプレッサー?


ldsandonから、使用しているオプションを正確に提供するように求められたので、次のようにします。

Compiling Options
(出典: beholdgenealogy.com

Linking Options
(出典: beholdgenealogy.com

23
lkessler

Delphi7からDelphi2010に移行すると、.exeはたとえば16メガバイトから35メガバイトに増加しました。

数週間前、エンバカデロフォーラムであなたと同じような質問をしました。 ( link )私のOPでは、このテーマに関する一連のリンクをリストしました。

UPXを使用して.exeを圧縮してみました。何時間も動作させると、.exeが大幅に削減されましたが、次の理由により、本番環境では使用しない可能性があります。

  1. かなりの数の.exeがあり、ビルドごとに半日待ちたくありません。 (これを減らす、UPXへのブルートフォースではないパラメーターのセットを見つけることができる可能性があります...)

  2. .exeのサイズは縮小されていますが、shippableは縮小されていません。これは、インストーラーが(当然のことながら)既に圧縮されているものからはるかに多くの圧縮を絞り込めないためです。圧縮ファイル...一方、元の16メガの.exeを8メガに減らすことができました。

  3. ある時点で(まれですが、決してではありませんが)、UPXexeがさまざまなアンチウイルスプログラムをトリガーして、アプリケーションにウイルスが含まれていることを報告したというレポートをいくつか読みました。 (これを見た日付、サイト、詳細を思い出せないので、ここで報告するのは少し不公平です。)しかし、その可能性さえも発生するリスクを冒すことには非常に不利であり、UPXテーブルから離れています...

Embarcaderoフォーラムのリンクには、このトピックに関する別のSOスレッドへの リンク も含まれています。

Delphi 2010に移行したときに見つけたコードの膨張には、引き続き驚きと失望があります。Nickが指摘しているように、Unicodeの2Xは非常に過剰です。

ただし、IMO、D2010は他の多くの点で非常に優れたアップグレードであるため、D2010に移行する場合の肥大化は比較的小さなトレードオフです。しかし、それは、おそらく1枚ではなく2枚のCDの出荷に移行する必要があることを意味します。私たちの組織からこれに対する反応を見るのを楽しみにしていません...

14
RobertFrank

「リリース」ビルド構成が使用する実際の設定を確認せずに、このサイズの増加を説明するには、多くの推測が必要です。

使用されていない場合でも「ドラッグイン」されるコードの量が大幅に増加する可能性のあるいくつかの要因を超えて、その増加の大きさは、デバッグ情報を含めることで最も簡単に説明できます。

コンパイラとリンカの設定を確認します。

  • デバッグ情報(コンパイラ設定)
  • TD32情報(リンカー)
  • リモートデバッグ情報(リンカー)

Delphi2009プロジェクトのこれらの設定をDelphi4の同等の設定と比較します。

10
Deltics

Unicodeから予想される2倍の増加を除外すると、考慮されていない2.5倍の増加になります。これは、スキップしたバージョンの数を考えると理にかなっています。 Delphi 4以降、VCLとRTLに多くの機能が追加されましたが、使用したことがなくても、すべてを簡単にスマートリンクできるわけではありません。使用しているユニットの数によっては、かなりの余分な荷物を運ぶ可能性があります。

Allen Bauerとコンパイラチームは これを減らすのに役立つD2010の新機能 を追加しましたが、明らかに彼らは慎重に踏み込んでおり、可能な限り多くの場所でそれを使用していませんでした。うまくいけば、2011年以降のリリースでより多くの粗雑な削減が見られるでしょう。

7
Mason Wheeler

私のいくつかの言葉を追加します。リンカは、コード階層に従うことができる場合にのみ、未使用のプロシージャと関数を削除できます。以下にリストされているリンカーの悪夢リスト:

  • メッセージ駆動型コード、悲しいニュースは、このコードを完全に削除できないことです。そのため、Delphiの空白のプロジェクトサイズはバージョンごとに大きくなり続けています。すべての新しいWindowsメッセージ(たとえば、最近紹介されたことがわかっている限り、WM_TOUCH)は、(Touch APIをまったく使用する予定がない場合でも)削除できないプロシージャ呼び出し階層を作成します。これは、すべてのcase WM _:フラグメントは、リンカーが使用するかどうかを決定できないものであるためです。

  • ユニットの開始、初期化、終了のセクションからアクセスされるコードおよびデータ構造。ここでは、いくつかの制御があり、不要な呼び出しやオブジェクトの作成を削除します。オンデマンドでオブジェクトを作成し、ファイナライズセクションでのみ解放する場合でも、慎重に作成してください

7
informin

「upx-実行可能ファイルの圧縮または展開」を使用@ http://upx.sourceforge.net


ツール/構成ツールに移動し、このように設定すると、IDEのメニュー項目を使用して、作業中の実行可能ファイルを簡単に圧縮できます。

Configuration

5

もう1つの方法は、「どのユニットがサイズを大きくするか」を確認することです。

これを行うには、IDEとJCL/JVCLインストールで統合された、JCL'Project Analyzer IDE 'を使用します。これにより、すべてのユニットがそれぞれのサイズで表示されます。でエクスポートできます。テキストファイル。2つの環境(D4とD2009)でそれを行うと、多くの関連情報が得られます。

4
philnext

D2010にアップグレードしているので、D2007とD2010の違いを確認するためにいくつかのテストを行いました。約60のフォーム(詳細フォーム、フレームなどのグリッド)を使用して、中規模の管理GUIアプリケーションをテストしました。 TMSコンポーネント+ Remobjectsを使用しています。

D2007:
「通常の」コンパイル:18.8mb
デバッグdcuあり:18.8mb(同じサイズ!)

D2010
通常:23.9
デバッグdcu:48.8mb(!)

したがって、debug dcuを使用すると、exeサイズが2倍になります...

私たちのビジネスサービスでテストします(大きなdfmはありません):
D2007:12.3 MB
D2010:17.1mb

そうです、D2010はexeファイルを(少し)増やしますが、これは私の顧客にとっては問題ではありません。

編集:コンパイルされたサイズに関するいくつかの情報:
D2007:
alt text
D2010:
alt text

したがって、コードサイズは大きくなりますが、データは2倍以上になります。

4
André

Dfm-sのフォーマットを確認してください。 exeファイルを小さくしたい場合は、バイナリ形式である必要があります。

3
Torbins

Exeコンプレッサーを使用したくない場合は、 StripReloc を試してみてください。

2
splash

1)詳細なマップファイルを生成しています。「useddebug dcus」を設定しているため、RTL/VCLユニットのシンボルも含まれています。例外処理システムがコールスタックなどを生成するために使用する場合は、実行可能ファイルに追加できます。また、何らかの方法で圧縮しないと、.exeサイズがかなり大きくなる可能性があります。

2)debug dcusを使用すると、通常、最適化とデバッグオプションを設定せずにコンパイルされるため、.exeがいくらか大きくなり、コードも遅くなります。リリースバージョンでは使用しないでください。

3)デバッグ情報は、実行可能ファイルではなくユニットにのみdebig情報を追加する必要がありますが、マップファイルを生成するにはIIRCが必要です。

2
user160694

D2010は拡張RTTIを追加し、RTTIはexeサイズを増やすことで悪名高い要因であるため、そのアプリケーションにとってD2009バイナリがどれほど大きいかを確認するのは興味深いことです。

D2009バイナリが大幅に小さい場合、Unicodeなどではありません。私自身のバイナリの場合、D7からD2009への移行は30%程度しかありません。

1

また、アイコンを変更することもできます。最新のデルファイのアイコンIDE(つまり、XE3)はVista/7と互換性があり、すべてのサイズ(私の知る限り、最大256x256)が含まれています。したがって、アイコンを変更することでexeファイルのサイズを減らすことができます。

1
Darthman

新しいdelphiの標準単位には、デバッグ情報を無効にしても含まれる、エラー文字列などのより多くの文字列と定数が含まれる場合があります。用途を確認してください。

特定のユニットを使用しない、またはそのユニットから不要なデータを削除する以外に、多くの解決策はありません。

(私の経験はDelphi 5でのものです)

0

実行可能コンプレッサーを使用すると、exeのサイズは小さくなりますが、インストールパッケージのサイズは小さくなりません。ただし、優れたコンプレッサーが必要な場合は、 ASPack を試してください。

@ Tom1952:ASPackは非常に高速で、ファイルを圧縮するのに数秒しかかかりません

0
Joe Meyer

プロジェクトオプションのデバッグ情報のチェックを外します。エンバカデロが解決策や説明を提供できない場合!!!解決策は簡単だと思います。Delphiだけに固執するのではなく、プログラミング言語がたくさんあります。すべてがプログラマーの想像力によってのみ制限されます。

0
tdjprog