Sign in Join
Wiki copytemporary

File size and smartlinking/fr: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: File size and smartlinking/fr

OldNewLine
1+Cet article est un travail en cours au sujet de la taille de l'exécutable et du linkage futé sous Lazarus. Soyez libre de contribuer .
2+
3+## Introduction
4+
5+Dans Free Pascal, "smartlinking" enlève le code et les variables inutilisés de l'exécutable final. Ceci est fait pendant l'étape de lien, quand l'exécutable est écrit en utilisant les fichiers d'exécution créés par le compilateur plus tôt.
6+
7+## Étude de cas 1 dans Windows
8+
9+Cette étude a été entreprise le 8 février 2006 parce Lazarus entièrement compilé avec Smartlinking est sorti (version 0.9.12). Il prévoit pour établir le rapport entre les résultats variables ci-dessous avec différentes versions de Lazarus et Free Pascal aussi bien qu'avec Smartlinking et en dehors.
10+
11+Les variables étant étudiées sont :
12+
13+- Taille de l'exécutable après un Strip
14+- Taille de l'exécutable après un strip et un UPX
15+- temps de lien
16+
17+Le temps de compilation n'est pas considéré ici parce qu'il est trop semblable sur toutes les configurations et beaucoup moins significatif que le temps de de l'édition de lien.
18+
19+La taille de l'exécutable sans Strip n'est pas incluse. Noter que Strip a toujours été employée en ligne de commande avec la commande :
20+
21+ strip --strip-all magnifier.exe
22+
23+Le programme compilé est la loupe virtuelle. Le source et les binaires pour ce programme sont librement disponibles pour le téléchargement sur : <http://magnifier.sourceforge.net>
24+
25+Au sujet du temps de lien noter svp que l'ordinateur utilisé est un Pentium 4 3.2GHz avec la carte mère Intel et un processeur dual core de 512MB de RAM.
26+
27+**Résultats**
28+
29+L'OS utilisé est Windows XP et la version 0.9.13 est de la même date qu'a la 0.9.12. La comparaison a eu lieu en utilisant les configurations logiciel suivantes:
30+
31+- Lazarus 0.9.12 disponible [ici](http://sourceforge.net/project/showfiles.php?group_id=89339). Free Pascal 2.0.2 vient avec l'installation. LCL et RTL sont smartlinked. Référencé dorénavant en tant que simplement 0.9.12.
32+
33+- Lazarus 0.9.13 téléchargé de la SVN de la même date. Free Pascal 2.0.2 installé séparément. La LCL n'est pas smartlinked. Référencé dorénavant en tant que simple 0.9.13 + 2.0.2.
34+
35+- Lazarus 0.9.13 snapshot. Free Pascal 2.1 vient avec l'installation. La LCL n'est pas smartlinked. Référencé dorénavant en tant que simple 0.9.13 + 2.1.
36+
37+- Lazarus 0.9.13 snapshot. Free Pascal 2.1 vient avec l'installation. La LCL est smartlinked. Référencé dorénavant en tant que simple 0.9.13 + 2.1 SL.
38+
39+| | 0.9.12 | 0.9.13 + 2.0.2 | 0.9.13 + 2.1 + SL | 0.9.13 + 2.1 |
40+|----|----|----|----|----|
41+| Taille de fichier après strip (en octets) | 1,108,480 | 1,587,712 | 1,425,408 | 1,649,152 |
42+| Taille de fichier après UPX (en octets) | 318,976 | 438,272 | 388,608 | 454,144 |
43+| Temps de l'édition de lien | 15 seconds | 5 seconds | 45 seconds | 10 seconds |
44+
45+<figure>
46+<img src="OuptutFileSizesComparisonChart.png" title="OuptutFileSizesComparisonChart.png" />
47+<figcaption>OuptutFileSizesComparisonChart.png</figcaption>
48+</figure>
49+
50+**Conclusion**
51+
52+La 0.9.13 snapshot du 8 février 2006 comporte un compilateur instable de la branche 2.1, ce qui peut faire des exécutables plus grands et l'édition de liens plus lente par rapport aux autres versions.
53+
54+La version 0.9.12 a le meilleur volume de fichier de tous, tous les deux avec UPX et sans, prouvant que Smartlinking peut vraiment diminuer le volume de fichier dans Windows. Ceci, cependant, ne vient pas sans coût, le coût en temps est l'édition de lien, ce qui est environ 3 fois plus haut que sans smartlinking.
55+
56+La version 0.9.12 est déjà saturé de Smartlinking sur Windows et aucune configuration supplémentaire n'est nécessaire. Ceci n'était pas le cas sur les releases précédentes.
57+
58+## Retirer les méhodes inutilisées dans une classe
59+
60+Q: Si une méthode virtuelle d'une classe n'étant pas utilisée du tout dans le programme, sera-t-elle supprimée dans l'exécutable ?
61+
62+R: Si vous utilisez FPC 2.3.1 avec l'optimisation sur le programme complet et que le compilateur peut prouver qu'elle n'est jamais appelable: Oui. Voir [[Whole Program Optimization/fr|Optimisation globale de programme]] pour plus d'information. Dans le cas où cela concerne le fil de discussion Lazarus concernant les gros exécutables: notez que cela n'a qu'un effet limité sur les programmes Lazarus, car presque tout le code LCL lié peut potentiellement être exécuté (dû à la façon dont la LCL est construite). En effect, je pense que la plupart des économies sont faites en rendant un nombre d'appels de méthodes virtuelles non virtuels, plutôt qu'en éliminant le code non accessible.
63+
64+L'éditeur de liens interne peut également le faire (jetant uniquement les appels de méthode virtuelle et non transformer les appels de méthode virtuelle en appels statiques), mais uniquement sur des plateformes Windows. Il n'est cependant pas actuellement activé dans le compilateur, car les modifications interrompent l'éditeur de liens externe. Il devrait donc être transformé en une option de ligne de commande (avec une vérification qui produit une erreur si vous essayez de lier une unité compilée avec l'option utilisant l'éditeur de liens externe), mais cela n'a pas encore été fait.
65+
66+Q: Comment le compilateur peut déterminer qu'une méthode virtuelle n'est pas utilisée du tout ?
67+
68+R: Si vous avez une hiérarchie de classe TBase-\>TDerived1-\>TDerived2 avec une méthode virtuelle appelée "vmethod", et nulle par dans le programme, on ne trouve un appel à vmethod, alors elle est inutilisée. Ou si elle est appelée en utilisant des instances de TDerived2, alors si l'éditeur de liens ne trouve pas de références directes à TDerived1.vmethod ou TBase.vmethod (p.ex. via des appels "inherited" depuis les méthodes TDerived2), il sait que les entréee VMT pour "vmethod" dans TDerived1 et TBase peut être mises à Nil.
69+
70+## Octets utilisé
71+
72+Voici une répartition du code utilisé en octets par unité Pascal. La taille est basée sur les informations Dwarf2 générées. Ne comprend pas la taille en ressources utilisées par l'unité.
73+
74+Le projet est une simple fiche (aucun contrôle graphique supplémentaire ajouté). La version de Lazarus est la version tronc du 23 Jan 2020.
75+
76+Aucun optimisation n'a été utilisée pendant la compilation.
77+
78+| Size | Bibl. | Paquet | Catégorie | Nom de fichier |
79+|--------|-------|----------|-----------|--------------------------------|
80+| 238704 | lcl | base | | controls.pp |
81+| 144064 | lcl | base | | graphics.pp |
82+| 111280 | lcl | ws | | win32/win32int.pp |
83+| 106880 | lcl | base | | forms.pp |
84+| 98000 | rtl | rtl | | system.pp |
85+| 94432 | lcl | base | | intfgraphics.pas |
86+| 90352 | lcl | base | | comctrls.pp |
87+| 90224 | rtl | rtl | | classes.pp |
88+| 59552 | lcl | base | | stdctrls.pp |
89+| 51888 | lcl | base | | interfacebase.pp |
90+| 50336 | rtl | rtl | | ../win/sysutils.pp |
91+| 37728 | lcl | base | | imglist.pp |
92+| 35456 | rtl | rtl | | rtl-objpas/src/inc/variants.pp |
93+| 33232 | lcl | lazutils | | lazutf8.pas |
94+| 31456 | lcl | base | | extctrls.pp |
95+| 30912 | fcl | image | | fcl-image/src/fpreadtiff.pas |
96+| 30816 | lcl | ws | | win32/win32wscomctrls.pp |
97+| 30800 | lcl | ws | | win32/win32wsmenus.pp |
98+| 28832 | lcl | base | | menus.pp |
99+| 25984 | lcl | base | | maskedit.pp |
100+| 24480 | rtl | rtl | | rtl-objpas/src/win/varutils.pp |
101+| 24048 | lcl | base | | dialogs.pp |
102+| 23632 | fcl | json | | fcl-json/src/fpjson.pp |
103+| 23456 | lcl | ws | | win32/win32wsstdctrls.pp |
104+| 23408 | lcl | base | | lclintf.pas |
105+| 18448 | lcl | base | | lresources.pp |
106+| 17904 | lcl | lazutils | | textstrings.pas |
107+| 16736 | fcl | image | | fcl-image/src/fpcanvas.pp |
108+| 16544 | lcl | lazutils | | graphtype.pp |
109+| 13408 | lcl | base | | themes.pas |
110+| 13168 | lcl | ws | | win32/win32proc.pp |
111+| 13136 | fcl | image | | fcl-image/src/pixtools.pp |
112+| 13088 | lcl | lazutils | | lazloggerbase.pas |
113+| 12368 | lcl | lazutils | | laz_avl_tree.pp |
114+| 11872 | fcl | image | | fcl-image/src/fpimage.pp |
115+| 11776 | lcl | base | | actnlist.pas |
116+| 11488 | lcl | base | | buttons.pp |
117+| 10576 | rtl | debug | | ../inc/heaptrc.pp |
118+| 10544 | lcl | ws | | win32/win32wsbuttons.pp |
119+| 10464 | rtl | rtl | | ../objpas/typinfo.pp |
120+| 9744 | fcl | image | | fcl-image/src/fpreadpng.pp |
121+| 9696 | lcl | base | | graphmath.pp |
122+| 9536 | lcl | lazutils | | lazlogger.pas |
123+| 9424 | lcl | lazutils | | lazfileutils.pas |
124+| 9296 | lcl | base | | buttonpanel.pas |
125+| 9248 | fcl | image | | fcl-image/src/fpwritetiff.pas |
126+| 8864 | lcl | base | | clipbrd.pp |
127+| 8768 | lcl | ws | | win32/win32extra.pas |
128+| 8768 | fcl | jpeg | | pasjpeg/src/jquant2.pas |
129+| 8720 | fcl | jpeg | | pasjpeg/src/jdmarker.pas |
130+| 8160 | fcl | image | | fcl-image/src/fpwritepng.pp |
131+| 8016 | fcl | image | | fcl-image/src/fpwritebmp.pp |
132+| 7792 | fcl | zlib | | paszlib/src/trees.pas |
133+| 7648 | fcl | zlib | | paszlib/src/zdeflate.pas |
134+| 7536 | fcl | image | | fcl-image/src/ellipses.pp |
135+| 7472 | lcl | ws | | win32/win32wsforms.pp |
136+| 7456 | fcl | image | | fcl-image/src/fpreadbmp.pp |
137+| 7328 | lcl | ws | | win32/win32themes.pas |
138+| 6880 | fcl | jpeg | | pasjpeg/src/jdcoefct.pas |
139+| 6864 | lcl | base | | lclproc.pas |
140+| 6624 | lcl | lazutils | | lazutf16.pas |
141+| 6400 | lcl | ws | | win32/win32wscontrols.pp |
142+| 6240 | fcl | zlib | | paszlib/src/infblock.pas |
143+| 5920 | lcl | base | | lclrescache.pas |
144+| 5792 | fcl | image | | fcl-image/src/fpreadjpeg.pas |
145+| 5728 | fcl | image | | fcl-image/src/fppixlcanv.pp |
146+| 5680 | fcl | ws | | win32/win32wsspin.pp |
147+| 5648 | lcl | lazutils | | maps.pp |
148+| 5632 | lcl | ws | | win32/win32wsimglist.pp |
149+| 5568 | fcl | jpeg | | pasjpeg/src/jchuff.pas |
150+| 5520 | fcl | jpeg | | pasjpeg/src/jmemmgr.pas |
151+| 5392 | fcl | jpeg | | pasjpeg/src/jquant1.pas |
152+| 5264 | fcl | image | | fcl-image/src/fpreadgif.pas |
153+| 5232 | fcl | jpeg | | pasjpeg/src/jdphuff.pas |
154+| 5152 | lcl | base | | imagelistcache.pas |
155+| 5104 | lcl | base | | widgetset/wsstdctrls.pp |
156+| 5008 | fcl | json | | fcl-json/src/jsonscanner.pp |
157+| 4992 | lcl | base | | widgetset/wslclclasses.pp |
158+| 4880 | fcl | jpeg | | pasjpeg/src/jcphuff.pas |
159+| 4848 | fcl | utils | | fcl-base/src/contnrs.pp |
160+| 4816 | fcl | image | | fcl-image/src/fptiffcmn.pas |
161+| 4768 | rtl | debug | | ../inc/lnfodwrf.pp |
162+| 4640 | fcl | jpeg | | pasjpeg/src/jcmaster.pas |
163+| 4592 | fcl | jpeg | | pasjpeg/src/jdhuff.pas |
164+| 4512 | fcl | jpeg | | pasjpeg/src/jcparam.pas |
165+| 4256 | fcl | jpeg | | pasjpeg/src/jcsample.pas |
166+| 4208 | lcl | base | | widgetset/wscomctrls.pp |
167+| 4160 | fcl | zlib | | paszlib/src/infcodes.pas |
168+| 3936 | fcl | zlib | | paszlib/src/inftrees.pas |
169+| 3616 | fcl | jpeg | | pasjpeg/src/jcmarker.pas |
170+| 3584 | fcl | zlib | | paszlib/src/zstream.pp |
171+| 3584 | fcl | jpeg | | pasjpeg/src/jidctint.pas |
172+| 3488 | fcl | image | | fcl-image/src/fpwritepnm.pp |
173+| 3472 | fcl | image | | fcl-image/src/fpreadpnm.pp |
174+| 3360 | fcl | jpeg | | pasjpeg/src/jdmerge.pas |
175+| 3312 | lcl | base | | icnstypes.pas |
176+| 3248 | fcl | jpeg | | pasjpeg/src/jccoefct.pas |
177+| 3216 | fcl | jpeg | | pasjpeg/src/jdsample.pas |
178+| 3168 | fcl | jpeg | | pasjpeg/src/jdmainct.pas |
179+| 3152 | lcl | base | | widgetset/wsimglist.pp |
180+| 3120 | lcl | base | | spin.pp |
181+| 3120 | fcl | jpeg | | pasjpeg/src/jdmaster.pas |
182+| 3104 | rtl | winapi | | winunits-base/src/uxtheme.pp |
183+| 2992 | lcl | base | | widgetset/wscontrols.pp |
184+| 2944 | fcl | json | | fcl-json/src/jsonparser.pp |
185+| 2896 | fcl | jpeg | | pasjpeg/src/jccolor.pas |
186+| 2848 | fcl | zlib | | paszlib/src/zinflate.pas |
187+| 2832 | fcl | jpeg | | pasjpeg/src/jdcolor.pas |
188+| 2816 | fcl | jpeg | | pasjpeg/src/jcdctmgr.pas |
189+| 2752 | lcl | lazutils | | lazmethodlist.pas |
190+| 2736 | fcl | jpeg | | pasjpeg/src/jidctred.pas |
191+| 2704 | rtl | debug | | ../inc/exeinfo.pp |
192+| 2688 | fcl | jpeg | | pasjpeg/src/jidctfst.pas |
193+| 2576 | fcl | jpeg | | pasjpeg/src/jidctflt.pas |
194+| 2496 | rtl | rtl | | ../objpas/fgl.pp |
195+| 2464 | fcl | jpeg | | pasjpeg/src/jdinput.pas |
196+| 2448 | lcl | ws | | win32/win32wsfactory.pas |
197+| 2352 | fcl | image | | fcl-image/src/fpwritejpeg.pas |
198+| 2320 | fcl | jpeg | | pasjpeg/src/jcprepct.pas |
199+| 2208 | lcl | lazutils | | lclclasses.pp |
200+| 2032 | fcl | jpeg | | pasjpeg/src/jerror.pas |
201+| 2016 | rtl | winapi | | winunits-base/src/multimon.pp |
202+| 2016 | fcl | jpeg | | pasjpeg/src/jfdctint.pas |
203+| 1952 | rtl | winapi | | windows.pp |
204+| 1888 | fcl | jpeg | | pasjpeg/src/jdapimin.pas |
205+| 1872 | fcl | image | | fcl-image/src/clipping.pp |
206+| 1824 | fcl | zlib | | paszlib/src/inffast.pas |
207+| 1808 | lcl | base | | extendedstrings.pas |
208+| 1712 | lcl | base | | customtimer.pas |
209+| 1648 | lcl | base | | helpintfs.pas |
210+| 1584 | fcl | jpeg | | pasjpeg/src/jfdctfst.pas |
211+| 1584 | fcl | jpeg | | pasjpeg/src/jfdctflt.pas |
212+| 1584 | rtl | rtl | | ../objpas/math.pp |
213+| 1472 | fcl | jpeg | | pasjpeg/src/jdpostct.pas |
214+| 1360 | fcl | jpeg | | pasjpeg/src/jdapistd.pas |
215+| 1280 | fcl | utils | | fcl-base/src/custapp.pp |
216+| 1200 | lcl | lazutils | | lazfilecache.pas |
217+| 1152 | lcl | base | | widgetset/wsmenus.pp |
218+| 1152 | lcl | lazutils | | lazclasses.pas |
219+| 1120 | fcl | jpeg | | pasjpeg/src/jddctmgr.pas |
220+| 1056 | lcl | base | | widgetset/wsforms.pp |
221+| 1040 | lcl | lazutils | | integerlist.pas |
222+| 1024 | fcl | jpeg | | pasjpeg/src/jcapimin.pas |
223+| 992 | lcl | base | | lcltype.pp |
224+| 848 | lcl | lazutils | | lazstringutils.pas |
225+| 832 | fcl | image | | fcl-image/src/fpimgcanv.pp |
226+| 768 | lcl | base | | widgetset/wsproc.pp |
227+| 688 | rtl | rtl | | ../objpas/types.pp |
228+| 672 | lcl | ws | | win32/win32wsdialogs.pp |
229+| 672 | lcl | lazutils | | lazutf8classes.pas |
230+| 656 | fcl | jpeg | | pasjpeg/src/jcmainct.pas |
231+| 656 | rtl | rtl | | ../inc/fpintres.pp |
232+| 640 | lcl | lazutils | | laztracer.pas |
233+| 624 | fcl | jpeg | | pasjpeg/src/jdatasrc.pas |
234+| 560 | fcl | image | | fcl-image/src/fpimgcmn.pp |
235+| 528 | fcl | zlib | | paszlib/src/infutil.pas |
236+| 528 | fcl | utils | | fcl-base/src/syncobjs.pp |
237+| 512 | lcl | base | | lclmessageglue.pas |
238+| 496 | fcl | jpeg | | pasjpeg/src/jutils.pas |
239+| 496 | fcl | jpeg | | pasjpeg/src/jdatadst.pas |
240+| 480 | fcl | jpeg | | pasjpeg/src/jcapistd.pas |
241+| 464 | rtl | winapi | | winunits-base/src/commctrl.pp |
242+| 432 | lcl | base | | widgetset/wsextctrls.pp |
243+| 432 | fcl | zlib | | paszlib/src/zbase.pas |
244+| 384 | fcl | jpeg | | pasjpeg/src/jmemnobs.pas |
245+| 368 | fcl | jpeg | | pasjpeg/src/jcomapi.pas |
246+| 336 | rtl | rtl | | ../objpas/objpas.pp |
247+| 288 | lcl | base | | widgetset/wsdialogs.pp |
248+| 288 | fcl | xml | | fcl-xml/src/htmldefs.pp |
249+| 256 | fcl | jpeg | | pasjpeg/src/jinclude.pas |
250+| 256 | fcl | jpeg | | pasjpeg/src/jcinit.pas |
251+| 256 | lcl | lazutils | | lcltaskdialog.pas |
252+| 256 | lcl | lazutils | | laz2_xmlread.pas |
253+| 224 | lcl | base | | widgetset/wsspin.pp |
254+| 208 | lcl | base | | widgetset/wsbuttons.pp |
255+| 208 | fcl | zlib | | paszlib/src/adler.pas |
256+| 192 | rtl | rtl | | ../objpas/unicodedata.pas |
257+| 144 | lcl | lazutils | | avglvltree.pas |
258+| 128 | lcl | base | | widgetset/wsreferences.pp |
259+| 112 | lcl | lazutils | | stringhashlist.pas |
260+| 112 | main | app | | project1.lpr |
261+| 96 | rtl | winapi | | ../win/windirs.pp |
262+| 96 | rtl | winapi | | ../win/dos.pp |
263+| 80 | lcl | base | | lclversion.pas |
264+| 80 | lcl | base | | lclplatformdef.pas |
265+| 80 | lcl | base | | forms/calcform.pas |
266+| 80 | lcl | lazutils | | fileutil.pas |
267+| 64 | lcl | ws | | win32/interfaces.pp |
268+| 64 | lcl | lazutils | | lazutilities.pas |
269+| 64 | lcl | lazutils | | laz2_dom.pas |
270+| 64 | rtl | rtl | | ../inc/strings.pp |
271+| 48 | lcl | lazutils | | lconvencoding.pas |
272+| 48 | lcl | lazutils | | lazsysutils.pas |
273+| 48 | lcl | lazutils | | laz2_xmlutils.pas |
274+| 48 | lcl | lazutils | | fpcadds.pas |
275+| 48 | fcl | utils | | fcl-base/src/rttiutils.pp |
276+| 32 | fcl | utils | | fcl-base/src/gettext.pp |
277+
278+- Remarquez que zlib est utilisée pour la lecture et l'écriture des images PNG images.
279+
280+### Par bibliothèque
281+
282+| Bibl. | code | pourcentage |
283+|-----------|---------|-------------|
284+| rtl | 340752 | 15.46% |
285+| lcl | 1491184 | 67.75% |
286+| fcl | 372176 | 16.88% |
287+| principal | 122 | 0.01% |
288+| Total | 2204234 | 100% |
289+
290+## Voir aussi
291+
292+- [[Size Matters/fr|La taille compte]]
293+- [Guide](http://members.chello.sk/ales/guide.html) pour les inexpérimentés qui oblige FPC et Lazarus à travailler correctement.
294+
295+---
296+*From the Free Pascal wiki, page "File size and smartlinking/fr", as it stood on 2020-12-15 after a change by E-ric, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history