Narazil jsem na takovou debatu o velikosti EXE u prázdné VCL aplikace. A jelikož jsem si chtěl upřesnit, jak je to s tou velikostí u jednotlivých verzí Delphi, strávil jsem cca 45 minut vytvářením prázdných aplikací a porovnáváním pomocí JCL Project Analyzeru, který je součástí instalace JCL.
Předem říkám, že si myslím, že velikost EXE není v dnešní době až tak podstatná, jelikož díky stránkování Windows a mapování souborů do paměti jsou v paměti jen opravdu používané části a zde se navíc pohybujeme v malém rozmezí. To platí jen tehdy, pokud nějaký inteligent nepoužijete EXE packer jako je UPX nebo PECompact. V tom případě nejen opravdu efektivně zabráníte uvedenému mechanismu jelikož celý program se musí rozbalit do paměti (pravda některé sekce PE souboru některé PE packery berou v potaz - ale není to pravidlem a na výsledku to moc nemění), ale navíc i vyloučíte sdílení kódu mezi více instancemi programu, takže v důsledku je na tom uživatel mnohem hůře, viz. třeba Are there any downsides to using UPX to compress a Windows executable?. A ne, velikost pro stažení není důvod (dá se zabalit jinak), a velikost USB disku už vůbec ne.
Ale nechme toho a zpět k našemu problému. Jelikož nemám nainstalované všechny možné verze Delphi je zde možnost pro doplnění - pokud máte někdo nainstalované chybějící verze a zároveň JCL s uvedeným expertem (je dostupný v menu Project - Analyze Project), můžete mi poslat výstup a připsat uvedené informace. Vytvoříte prázdnou VCL aplikaci a spustíte expert (lépe po Buildu).
Velikost výsledného souboru
- Delphi 5 - 294 400
- Delphi 7 - 368 128 (nemám tam JCL, takže zatím bez podrobností)
- Delphi 2007 - 407 552 (manifest)
- Delphi 2009 - 499 712 (manifest)
- Delphi 2010 - 817 152 (manifest)
- Delphi XE - 915 456 (manifest)
- Delphi XE - 824 832 (manifest, bez aplikační ikony)
Vysvětlivka k poslednímu řádku: nový projekt obsahuje pěknou aplikační ikonu v různých velikostech (hold moderní Windows to prosazují) o velikosti cca 90K. Pokud ji nahradíte za menší tak je vymalováno.
Složení PE souboru
Jednotlivé sekce PE souboru (neboli EXE) pro jednotlivé verze (poslední řádek v analyzeru).
- Delphi 5: Code: 251124, Data: 2482, Bss: 2077, Resource 13312
- Delphi 2007: Code: 345142, Data: 5906, Bss: 19654, Resource 18432
- Delphi 2009: Code: 398007, Data: 6488, Bss: 20881, Resource 53248
- Delphi 2010: Code: 674037, Data: 7666, Bss: 21161, Resource 54784
- Delphi XE (bez ikony): Code: 717700, Data: 7680, Bss: 21112, Resource 17920
- Delphi XE: 717700, Data: 7680, Bss: 21112, Resource 108544 - ikona
V Delphi 2009 byl do resources přidán 33K soubor character.res. V Delphi 2010 je zvětšení způsobeno velkým rozšířením RTTI informací (např. pro tohle použití RTTI mi to za to stojí).
Dále uvedené soubory zde ke stažení pro vlastní analýzu (na stránce jsou zobrazeny jen některé): D5.txt, D2007.txt, D2009.txt, D2010.txt, DXE.txt
Delphi XE
Name Size Group
--------- ------- -----------------
Controls 127 936 (CODE+ICODE+DATA)
Classes 106 900 (CODE+ICODE+DATA)
Forms 87 788 (CODE+ICODE+DATA)
Graphics 56 684 (CODE+ICODE+DATA)
SysUtils 56 044 (CODE+ICODE+DATA)
System 40 352 (CODE+ICODE+DATA)
Menus 40 284 (CODE+ICODE+DATA)
Character 37 400 (CODE+ICODE+DATA)
Variants 33 928 (CODE+ICODE+DATA)
Themes 22 720 (CODE+ICODE+DATA)
Project1 19 956 (CODE+ICODE+DATA)
ImgList 14 812 (CODE+ICODE+DATA)
Registry 12 112 (CODE+ICODE+DATA)
ActnList 9 100 (CODE+ICODE+DATA)
HelpIntfs 8 304 (CODE+ICODE+DATA)
Printers 7 680 (CODE+ICODE+DATA)
GraphUtil 7 304 (CODE+ICODE+DATA)
Windows 6 652 (CODE+ICODE+DATA)
TypInfo 6 004 (CODE+ICODE+DATA)
SyncObjs 5 440 (CODE+ICODE+DATA)
UxTheme 3 444 (CODE+ICODE+DATA)
Dialogs 2 728 (CODE+ICODE+DATA)
VarUtils 2 072 (CODE+ICODE+DATA)
IOUtils 1 388 (CODE+ICODE+DATA)
ExcUtils 1 364 (CODE+ICODE+DATA)
ExtCtrls 1 100 (CODE+ICODE+DATA)
Types 1 020 (CODE+ICODE+DATA)
ComCtrls 976 (CODE+ICODE+DATA)
FlatSB 920 (CODE+ICODE+DATA)
Contnrs 912 (CODE+ICODE+DATA)
SysConst 840 (CODE+ICODE+DATA)
TimeSpan 740 (CODE+ICODE+DATA)
Consts 616 (CODE+ICODE+DATA)
Messages 484 (CODE+ICODE+DATA)
RTLConsts 440 (CODE+ICODE+DATA)
Unit1 416 (CODE+ICODE+DATA)
StdActns 396 (CODE+ICODE+DATA)
ActiveX 372 (CODE+ICODE+DATA)
SysInit 308 (CODE+ICODE+DATA)
CommCtrl 280 (CODE+ICODE+DATA)
IniFiles 148 (CODE+ICODE+DATA)
Clipbrd 140 (CODE+ICODE+DATA)
Dwmapi 100 (CODE+ICODE+DATA)
MultiMon 68 (CODE+ICODE+DATA)
WinSpool 40 (CODE+ICODE+DATA)
Delphi 2007
Name Size Group
--------- ------ -----------------
Controls 79 643 (CODE+ICODE+DATA)
Forms 62 744 (CODE+ICODE+DATA)
Classes 40 223 (CODE+ICODE+DATA)
Menus 31 890 (CODE+ICODE+DATA)
Graphics 31 289 (CODE+ICODE+DATA)
SysUtils 27 153 (CODE+ICODE+DATA)
System 23 850 (CODE+ICODE+DATA)
Variants 10 952 (CODE+ICODE+DATA)
ImgList 5 885 (CODE+ICODE+DATA)
ActnList 4 956 (CODE+ICODE+DATA)
GraphUtil 4 742 (CODE+ICODE+DATA)
HelpIntfs 4 714 (CODE+ICODE+DATA)
Themes 3 046 (CODE+ICODE+DATA)
UxTheme 3 028 (CODE+ICODE+DATA)
Windows 2 885 (CODE+ICODE+DATA)
TypInfo 2 203 (CODE+ICODE+DATA)
VarUtils 2 053 (CODE+ICODE+DATA)
MultiMon 1 921 (CODE+ICODE+DATA)
Dialogs 1 877 (CODE+ICODE+DATA)
Registry 1 493 (CODE+ICODE+DATA)
ExtCtrls 858 (CODE+ICODE+DATA)
FlatSB 797 (CODE+ICODE+DATA)
SysConst 728 (CODE+ICODE+DATA)
Project1 555 (CODE+ICODE+DATA)
Consts 528 (CODE+ICODE+DATA)
DwmApi 412 (CODE+ICODE+DATA)
Contnrs 401 (CODE+ICODE+DATA)
Unit1 374 (CODE+ICODE+DATA)
SyncObjs 362 (CODE+ICODE+DATA)
StdActns 301 (CODE+ICODE+DATA)
SysInit 293 (CODE+ICODE+DATA)
RTLConsts 248 (CODE+ICODE+DATA)
CommCtrl 166 (CODE+ICODE+DATA)
Clipbrd 146 (CODE+ICODE+DATA)
IniFiles 109 (CODE+ICODE+DATA)
Types 88 (CODE+ICODE+DATA)
Printers 70 (CODE+ICODE+DATA)
Delphi 5
Name Size Group
-------- ------ -----------
Controls 61 316 (CODE+DATA)
Forms 49 623 (CODE+DATA)
Classes 30 227 (CODE+DATA)
Graphics 29 307 (CODE+DATA)
Menus 25 319 (CODE+DATA)
System 20 062 (CODE+DATA)
SysUtils 16 664 (CODE+DATA)
ImgList 5 296 (CODE+DATA)
ActnList 3 624 (CODE+DATA)
Windows 2 572 (CODE+DATA)
MultiMon 1 939 (CODE+DATA)
TypInfo 1 360 (CODE+DATA)
FlatSB 799 (CODE+DATA)
Consts 776 (CODE+DATA)
Dialogs 733 (CODE+DATA)
SysConst 712 (CODE+DATA)
Contnrs 452 (CODE+DATA)
Project2 421 (CODE+DATA)
SysInit 396 (CODE+DATA)
Unit1 396 (CODE+DATA)
StdActns 348 (CODE+DATA)
Commctrl 244 (CODE+DATA)
Clipbrd 148 (CODE+DATA)
Printers 72 (CODE+DATA)
ActiveX 64 (CODE+DATA)
Math 64 (CODE+DATA)
CommDlg 56 (CODE+DATA)
Dlgs 56 (CODE+DATA)
ExtCtrls 56 (CODE+DATA)
Imm 56 (CODE+DATA)
Messages 56 (CODE+DATA)
RegStr 56 (CODE+DATA)
ShellAPI 56 (CODE+DATA)
ShlObj 56 (CODE+DATA)
StdCtrls 56 (CODE+DATA)
UrlMon 56 (CODE+DATA)
WinInet 56 (CODE+DATA)
WinSpool 56 (CODE+DATA)