File size and smartlinking/fr

From Lazarus wiki
Revision as of 14:06, 22 November 2020 by E-ric (talk | contribs) (Retirer les méhodes inutilisées dans une classe)

Deutsch (de) English (en) français (fr) 日本語 (ja) português (pt) 中文(中国大陆)‎ (zh_CN)

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 .

Introduction

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.

Étude de cas 1 dans Windows

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.

Les variables étant étudiées sont :

  • Taille de l'exécutable après un Strip
  • Taille de l'exécutable après un strip et un UPX
  • temps de lien

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.

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 :

strip --strip-all magnifier.exe

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

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.

Résultats

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:

  • Lazarus 0.9.12 disponible ici. 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.
  • 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.
  • 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.
  • 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.
0.9.12 0.9.13 + 2.0.2 0.9.13 + 2.1 + SL 0.9.13 + 2.1
Taille de fichier après strip (en octets) 1,108,480 1,587,712 1,425,408 1,649,152
Taille de fichier après UPX (en octets) 318,976 438,272 388,608 454,144
Temps de l'édition de lien 15 seconds 5 seconds 45 seconds 10 seconds

OuptutFileSizesComparisonChart.png

Conclusion


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.

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.

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.

Retirer les méhodes inutilisées dans une classe

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 ?

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 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.

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.

Q: Comment le compilateur peut déterminer qu'une méthode virtuelle n'est pas utilisée du tout ?

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.

Octets utilisé

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é.

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.

Aucun optimisation n'a été utilisée pendant la compilation.

Size Bibl. Paquet Catégorie Nom de fichier
238704 lcl base controls.pp
144064 lcl base graphics.pp
111280 lcl ws win32/win32int.pp
106880 lcl base forms.pp
98000 rtl rtl system.pp
94432 lcl base intfgraphics.pas
90352 lcl base comctrls.pp
90224 rtl rtl classes.pp
59552 lcl base stdctrls.pp
51888 lcl base interfacebase.pp
50336 rtl rtl ../win/sysutils.pp
37728 lcl base imglist.pp
35456 rtl rtl rtl-objpas/src/inc/variants.pp
33232 lcl lazutils lazutf8.pas
31456 lcl base extctrls.pp
30912 fcl image fcl-image/src/fpreadtiff.pas
30816 lcl ws win32/win32wscomctrls.pp
30800 lcl ws win32/win32wsmenus.pp
28832 lcl base menus.pp
25984 lcl base maskedit.pp
24480 rtl rtl rtl-objpas/src/win/varutils.pp
24048 lcl base dialogs.pp
23632 fcl json fcl-json/src/fpjson.pp
23456 lcl ws win32/win32wsstdctrls.pp
23408 lcl base lclintf.pas
18448 lcl base lresources.pp
17904 lcl lazutils textstrings.pas
16736 fcl image fcl-image/src/fpcanvas.pp
16544 lcl lazutils graphtype.pp
13408 lcl base themes.pas
13168 lcl ws win32/win32proc.pp
13136 fcl image fcl-image/src/pixtools.pp
13088 lcl lazutils lazloggerbase.pas
12368 lcl lazutils laz_avl_tree.pp
11872 fcl image fcl-image/src/fpimage.pp
11776 lcl base actnlist.pas
11488 lcl base buttons.pp
10576 rtl debug ../inc/heaptrc.pp
10544 lcl ws win32/win32wsbuttons.pp
10464 rtl rtl ../objpas/typinfo.pp
9744 fcl image fcl-image/src/fpreadpng.pp
9696 lcl base graphmath.pp
9536 lcl lazutils lazlogger.pas
9424 lcl lazutils lazfileutils.pas
9296 lcl base buttonpanel.pas
9248 fcl image fcl-image/src/fpwritetiff.pas
8864 lcl base clipbrd.pp
8768 lcl ws win32/win32extra.pas
8768 fcl jpeg pasjpeg/src/jquant2.pas
8720 fcl jpeg pasjpeg/src/jdmarker.pas
8160 fcl image fcl-image/src/fpwritepng.pp
8016 fcl image fcl-image/src/fpwritebmp.pp
7792 fcl zlib paszlib/src/trees.pas
7648 fcl zlib paszlib/src/zdeflate.pas
7536 fcl image fcl-image/src/ellipses.pp
7472 lcl ws win32/win32wsforms.pp
7456 fcl image fcl-image/src/fpreadbmp.pp
7328 lcl ws win32/win32themes.pas
6880 fcl jpeg pasjpeg/src/jdcoefct.pas
6864 lcl base lclproc.pas
6624 lcl lazutils lazutf16.pas
6400 lcl ws win32/win32wscontrols.pp
6240 fcl zlib paszlib/src/infblock.pas
5920 lcl base lclrescache.pas
5792 fcl image fcl-image/src/fpreadjpeg.pas
5728 fcl image fcl-image/src/fppixlcanv.pp
5680 fcl ws win32/win32wsspin.pp
5648 lcl lazutils maps.pp
5632 lcl ws win32/win32wsimglist.pp
5568 fcl jpeg pasjpeg/src/jchuff.pas
5520 fcl jpeg pasjpeg/src/jmemmgr.pas
5392 fcl jpeg pasjpeg/src/jquant1.pas
5264 fcl image fcl-image/src/fpreadgif.pas
5232 fcl jpeg pasjpeg/src/jdphuff.pas
5152 lcl base imagelistcache.pas
5104 lcl base widgetset/wsstdctrls.pp
5008 fcl json fcl-json/src/jsonscanner.pp
4992 lcl base widgetset/wslclclasses.pp
4880 fcl jpeg pasjpeg/src/jcphuff.pas
4848 fcl utils fcl-base/src/contnrs.pp
4816 fcl image fcl-image/src/fptiffcmn.pas
4768 rtl debug ../inc/lnfodwrf.pp
4640 fcl jpeg pasjpeg/src/jcmaster.pas
4592 fcl jpeg pasjpeg/src/jdhuff.pas
4512 fcl jpeg pasjpeg/src/jcparam.pas
4256 fcl jpeg pasjpeg/src/jcsample.pas
4208 lcl base widgetset/wscomctrls.pp
4160 fcl zlib paszlib/src/infcodes.pas
3936 fcl zlib paszlib/src/inftrees.pas
3616 fcl jpeg pasjpeg/src/jcmarker.pas
3584 fcl zlib paszlib/src/zstream.pp
3584 fcl jpeg pasjpeg/src/jidctint.pas
3488 fcl image fcl-image/src/fpwritepnm.pp
3472 fcl image fcl-image/src/fpreadpnm.pp
3360 fcl jpeg pasjpeg/src/jdmerge.pas
3312 lcl base icnstypes.pas
3248 fcl jpeg pasjpeg/src/jccoefct.pas
3216 fcl jpeg pasjpeg/src/jdsample.pas
3168 fcl jpeg pasjpeg/src/jdmainct.pas
3152 lcl base widgetset/wsimglist.pp
3120 lcl base spin.pp
3120 fcl jpeg pasjpeg/src/jdmaster.pas
3104 rtl winapi winunits-base/src/uxtheme.pp
2992 lcl base widgetset/wscontrols.pp
2944 fcl json fcl-json/src/jsonparser.pp
2896 fcl jpeg pasjpeg/src/jccolor.pas
2848 fcl zlib paszlib/src/zinflate.pas
2832 fcl jpeg pasjpeg/src/jdcolor.pas
2816 fcl jpeg pasjpeg/src/jcdctmgr.pas
2752 lcl lazutils lazmethodlist.pas
2736 fcl jpeg pasjpeg/src/jidctred.pas
2704 rtl debug ../inc/exeinfo.pp
2688 fcl jpeg pasjpeg/src/jidctfst.pas
2576 fcl jpeg pasjpeg/src/jidctflt.pas
2496 rtl rtl ../objpas/fgl.pp
2464 fcl jpeg pasjpeg/src/jdinput.pas
2448 lcl ws win32/win32wsfactory.pas
2352 fcl image fcl-image/src/fpwritejpeg.pas
2320 fcl jpeg pasjpeg/src/jcprepct.pas
2208 lcl lazutils lclclasses.pp
2032 fcl jpeg pasjpeg/src/jerror.pas
2016 rtl winapi winunits-base/src/multimon.pp
2016 fcl jpeg pasjpeg/src/jfdctint.pas
1952 rtl winapi windows.pp
1888 fcl jpeg pasjpeg/src/jdapimin.pas
1872 fcl image fcl-image/src/clipping.pp
1824 fcl zlib paszlib/src/inffast.pas
1808 lcl base extendedstrings.pas
1712 lcl base customtimer.pas
1648 lcl base helpintfs.pas
1584 fcl jpeg pasjpeg/src/jfdctfst.pas
1584 fcl jpeg pasjpeg/src/jfdctflt.pas
1584 rtl rtl ../objpas/math.pp
1472 fcl jpeg pasjpeg/src/jdpostct.pas
1360 fcl jpeg pasjpeg/src/jdapistd.pas
1280 fcl utils fcl-base/src/custapp.pp
1200 lcl lazutils lazfilecache.pas
1152 lcl base widgetset/wsmenus.pp
1152 lcl lazutils lazclasses.pas
1120 fcl jpeg pasjpeg/src/jddctmgr.pas
1056 lcl base widgetset/wsforms.pp
1040 lcl lazutils integerlist.pas
1024 fcl jpeg pasjpeg/src/jcapimin.pas
992 lcl base lcltype.pp
848 lcl lazutils lazstringutils.pas
832 fcl image fcl-image/src/fpimgcanv.pp
768 lcl base widgetset/wsproc.pp
688 rtl rtl ../objpas/types.pp
672 lcl ws win32/win32wsdialogs.pp
672 lcl lazutils lazutf8classes.pas
656 fcl jpeg pasjpeg/src/jcmainct.pas
656 rtl rtl ../inc/fpintres.pp
640 lcl lazutils laztracer.pas
624 fcl jpeg pasjpeg/src/jdatasrc.pas
560 fcl image fcl-image/src/fpimgcmn.pp
528 fcl zlib paszlib/src/infutil.pas
528 fcl utils fcl-base/src/syncobjs.pp
512 lcl base lclmessageglue.pas
496 fcl jpeg pasjpeg/src/jutils.pas
496 fcl jpeg pasjpeg/src/jdatadst.pas
480 fcl jpeg pasjpeg/src/jcapistd.pas
464 rtl winapi winunits-base/src/commctrl.pp
432 lcl base widgetset/wsextctrls.pp
432 fcl zlib paszlib/src/zbase.pas
384 fcl jpeg pasjpeg/src/jmemnobs.pas
368 fcl jpeg pasjpeg/src/jcomapi.pas
336 rtl rtl ../objpas/objpas.pp
288 lcl base widgetset/wsdialogs.pp
288 fcl xml fcl-xml/src/htmldefs.pp
256 fcl jpeg pasjpeg/src/jinclude.pas
256 fcl jpeg pasjpeg/src/jcinit.pas
256 lcl lazutils lcltaskdialog.pas
256 lcl lazutils laz2_xmlread.pas
224 lcl base widgetset/wsspin.pp
208 lcl base widgetset/wsbuttons.pp
208 fcl zlib paszlib/src/adler.pas
192 rtl rtl ../objpas/unicodedata.pas
144 lcl lazutils avglvltree.pas
128 lcl base widgetset/wsreferences.pp
112 lcl lazutils stringhashlist.pas
112 main app project1.lpr
96 rtl winapi ../win/windirs.pp
96 rtl winapi ../win/dos.pp
80 lcl base lclversion.pas
80 lcl base lclplatformdef.pas
80 lcl base forms/calcform.pas
80 lcl lazutils fileutil.pas
64 lcl ws win32/interfaces.pp
64 lcl lazutils lazutilities.pas
64 lcl lazutils laz2_dom.pas
64 rtl rtl ../inc/strings.pp
48 lcl lazutils lconvencoding.pas
48 lcl lazutils lazsysutils.pas
48 lcl lazutils laz2_xmlutils.pas
48 lcl lazutils fpcadds.pas
48 fcl utils fcl-base/src/rttiutils.pp
32 fcl utils fcl-base/src/gettext.pp
  • Remarquez que zlib est utilisée pour la lecture et l'écriture des images PNG images.

Par bibliothèque

Bibl. code pourcentage
rtl 340752 15.46%
lcl 1491184 67.75%
fcl 372176 16.88%
principal 122 0.01%
Total 2204234 100%

Voir aussi

  • Size Matters/fr
  • Guide pour les inexpérimentés qui oblige FPC et Lazarus à travailler correctement.