Dinamičko vs. statičko linkovanje

Teme koje se tiču programiranja

Moderator: Urednik

Post Reply

Administrator
Administrator
offline
User avatar

Posts: 4590
Joined: 04 Feb 2011, 20:32
Location: Beograd
Contact:

Post Napisano: 07 Jan 2012, 18:12


Samo da vam skrenem jedno vrlo zanimljivo pitanje sa StackOverflow i neke još zanimljivije odgovore: tema se bavi razlikama između statičkog i dinamičkog linkovanja - prednostima i manama jednog i drugog.

Pitanje:
Are there any compelling performance reasons to choose static linking over dynamic linking or visa versa in certain situations? I've heard or read the following, but I don't know enough on the subject to vouch for their veracity.
  • The difference in performance between static linking and dynamic linking is usually negligible.
  • (1) is not true if using a profiling compiler that uses profile data to optimize program hotpaths because with static linking, the compiler can optimize both your code and the library code. With dynamic linking only your code can be optimized. If most of the time is spent running library code, this can make a big difference. Otherwise, (1) still applies.
Jedan od najzanimljivijih odgovora:
  • Dynamic linking can reduce total resource consumption (if more than one process shares the same library (including the version in "the same", of course)). I believe this is the argument that drives it its presence in most environments. Here "resources" includes disk space, RAM, and cache space. Of course, if your dynamic linker is insufficiently flexible there is a risk of DLL hell.
  • Dynamic linking means that bug fixes and upgrades to libraries propagate to improve your product without requiring you to ship anything.
        Plugins always call for dynamic linking.
  • Static linking, means that you can know the code will run in very limited environments (early in the boot process, or in rescue mode).
  • Static linking can make binaries easier to distribute to diverse user environments (at the cost of sending a large and more resource hungry program).
  • Static linking may allow slightly faster startup times, but this depends to some degree on both the size and complexity of your program and on the details of the OSs loading strategy.
Some edits to include the very relevant suggestions in the comments and in other answers. I'd like to note that the way you break on this depends a lot on what environment you plan to run in. Minimal embedded systems may not have enough resources to support dynamic linking. Slightly larger small systems may well support linking, because their memory is small enough to make the RAM savings from dynamic linking very attractive. Full blown consumer PCs have, as Mark notes, enormous resources, and you can probably let the convenience issues drive you thinking on this matter.

To address the performance and efficiency issues: it depends. Classically, dynamic libraries require a some kind of glue layer which often means double dispatch or an extra layer of indirection in function addressing and can cost a little speed (but is function calling time actually a big part of your running time???). However, if you are running multiple processes which all call the same library a lot, you can end up saving cache lines (and thus winning on running performance) when using dynamic linking relative using static linking. (Unless modern OS's are smart enough to notice identical segments in statically linked binaries. Seems hard, anyone know?) Another issue: loading time. You pay loading costs at some point. When you pay this cost depends on how the OS works as well as what linking you use. Maybe you'd rather put off paying it until you know you need it. Note that static-vs--dynamic linking is traditionally not a optimization issue, because they both involve separate compilation down to object files. However, this is not required: a compiler can in principle, "compile" "static libraries" to a digested AST form initially, and "link" them by adding those ASTs to the ones generated for the main code, thus empowering global optimization. None of the systems I use do this, so I can't comment on how well it works. The way to answer performance questions is always by testing (and use an test environment as much like the deployment environment as possible).
http://stackoverflow.com/questions/1993 ... ic-linking

U skladu sa ovim, možda će vam biti zanimljiv i sledeći link (podatke sa sajta uzmite sa dozom rezerve):
http://sta.li/



Prijatelj foruma
Prijatelj foruma
offline
User avatar

Posts: 699
Joined: 08 May 2007, 12:39
Location: Banja Luka

Post Napisano: 07 Jan 2012, 18:26


Veoma zanimljiva tema. Ja sam se poprilično zanimao statičkim linkovanjem, međutim, to je uvijek bilo u teorijskom domenu, nisam nikad imao realnu potrebu.

Kakva su tvoja iskustva, bocke?



Administrator
Administrator
offline
User avatar

Posts: 4590
Joined: 04 Feb 2011, 20:32
Location: Beograd
Contact:

Post Napisano: 07 Jan 2012, 19:25


Pravo da ti kažem nisam imao puno iskustva sa ovim. Ono što jesam...

Petljao sam malo sa ranijim verzijama Minix-a i Elks-om. Na računarima sa procesorima starijim od i386 je dinamičko linkovanje vrlo teško implementirati zbog nedostatka zaštićenog režima, pa oni uglavnom koriste statičko linkovanje (mada postoje izuzeci). I Minix i Elks su koristili a.out format. Problem sa ovim formatom nije bila samo memorijska ograničenost (namenjeni pokretanju na i8086, i80186 i i80286 pa su nasledili i ograničenja adresiranja tih procesora), već i dizajn samog formata (Minix a.out format). Minix a.out format je imao ograničenja veličine binarnih datoteka, ali i veličine datoteka u memoriji.

Na ranim verzijama Linuksa (92/93) se koristio modifikovani Minix a.out format i sve aplikacije su bile statički kompajlirane. No, ovo je bila praksa i sa tradicionalnim AT&T research verzijama Unix-a. A i Linuks je razvijan na gore pomenutom Miniksu.

Naravno ovde nije bilo moguće napraviti neki benchmark. :)

Što se tiče statičkog linkovanja na desktop sistemima, to je već više stvar za igranje i eksperimentisanje. Ne nešto što bi (u većini slučajeva) bilo praktično. A neki softverski paketi ni ne podržavaju statičko linkovanje (u principu sve što koristi runtime module - uključujući i moderne verzije Perl-a).

Ali postoje neke situacije kada su statički izvršni fajlovi više nego korisni. Recimo mali alati koji se mogu spakovati na usb, podešeni da sve podatke čitaju i zapisuju iz trenutnog direktorijuma. Ili recimo, nekoliko statički linkovanih dijagnostičkih, recovery i mrežnih alata koji se mogu staviti na posebnu particiju male veličine, a koristili bi se sa nekog Live CDa (recimo Slack DVD-a). Nisam ovo probao, ali nešto slično jesam: imam direktorijum sa statički linkovanim (dietlibc) links browserom - ovo se pokazalo jako korisno pri instalaciji Slacka. Montiraš particiju, pokreneš links i vidiš dodatnu dokumentaciju ili pretraži google za neki slackbuild i/ili program...
Last edited by bocke on 07 Jan 2012, 20:13, edited 1 time in total.



Prijatelj foruma
Prijatelj foruma
offline
User avatar

Posts: 699
Joined: 08 May 2007, 12:39
Location: Banja Luka

Post Napisano: 07 Jan 2012, 21:21


bocke wrote: Ali postoje neke situacije kada su statički izvršni fajlovi više nego korisni. Recimo mali alati koji se mogu spakovati na usb, podešeni da sve podatke čitaju i zapisuju iz trenutnog direktorijuma. Ili recimo, nekoliko statički linkovanih dijagnostičkih, recovery i mrežnih alata koji se mogu staviti na posebnu particiju male veličine, a koristili bi se sa nekog Live CDa (recimo Slack DVD-a). Nisam ovo probao, ali nešto slično jesam: imam direktorijum sa statički linkovanim (dietlibc) links browserom - ovo se pokazalo jako korisno pri instalaciji Slacka. Montiraš particiju, pokreneš links i vidiš dodatnu dokumentaciju ili pretraži google za neki slackbuild i/ili program...
Ovo mi je interesantno. Doduše, mene prvenstveno zanima upotrebna vrijednost kad su desktop aplikacije u pitanju. Vidim da i Skype i Opera još uvijek nude static build. Nisam još uvijek probao, ali s obzirom da me zanima - moraću u dogledno vrijeme. :)



Administrator
Administrator
offline
User avatar

Posts: 4590
Joined: 04 Feb 2011, 20:32
Location: Beograd
Contact:

Post Napisano: 07 Jan 2012, 21:35


Ovo ti više ima veze sa sistemskim dizajnom. :) Statički linkovane aplikacije postoje i postojaće - pogotovo kad su pitanju propriatry ili neki veći FOSS paketi koje je naporno kompajlirati ručno. ;) A postoji mogućnost kompajliranja određenih statičkih biblioteka u dinamičku izvršnu datoteku. Recimo kao nekadašnje binarne verzije Opere sa statički kompajliranim Qt-om. Mislim da se na sličan način pakuju i binarne verzije LibreOfficea i Firefoxa. :)

A za to što tebe interesuje, baci pogled ovde:
http://portablelinuxapps.org/
http://www.portools.com/

Po mom ranijem iskustvu (nisam siguran da li su ovi sajtovi bili u pitanju), ove aplikacije ponekad ostavljaju tragove u home. Ranije sam kompajlirao neke aplikacije da podatke čuvaju u CWD, tako da mislim da je moguće rešiti i taj problem. Ono, baci pogled testiraj, pa javi da li ostavljaju repove. :)



Prijatelj foruma
Prijatelj foruma
offline
User avatar

Posts: 699
Joined: 08 May 2007, 12:39
Location: Banja Luka

Post Napisano: 07 Jan 2012, 22:31


Ma sve je jasno, samo sam zaboravio i ovo citirati:  :grin:
Što se tiče statičkog linkovanja na desktop sistemima, to je već više stvar za igranje i eksperimentisanje. Ne nešto što bi (u većini slučajeva) bilo praktično. A neki softverski paketi ni ne podržavaju statičko linkovanje (u principu sve što koristi runtime module - uključujući i moderne verzije Perl-a).
Hvala za linkove, nisam znao za ove projekte. Biće od velike pomoći. :beer:



Administrator
Administrator
offline
User avatar

Posts: 4590
Joined: 04 Feb 2011, 20:32
Location: Beograd
Contact:

Post Napisano: 07 Jan 2012, 23:04


Igrao sam se malo sa kreiranjem portabilne aplikacije. Da ne bismo o tome ovde (offtopic), odvojio sam to u posebnu temu:
index.php?topic=1069.0


Post Reply

Who is online

Users browsing this forum: No registered users and 14 guests