Menghubungkan statis vs menghubungkan dinamis

399

Adakah alasan kinerja yang meyakinkan untuk memilih tautan statis daripada tautan dinamis atau sebaliknya dalam situasi tertentu? Saya pernah mendengar atau membaca yang berikut, tetapi saya tidak cukup tahu tentang subjek untuk menjamin kebenarannya.

1) Perbedaan kinerja runtime antara tautan statis dan tautan dinamis biasanya dapat diabaikan.

2) (1) tidak benar jika menggunakan kompiler profiling yang menggunakan data profil untuk mengoptimalkan hotpath program karena dengan tautan statis, kompiler dapat mengoptimalkan kode Anda dan kode perpustakaan. Dengan tautan dinamis, hanya kode Anda yang dapat dioptimalkan. Jika sebagian besar waktu dihabiskan untuk menjalankan kode perpustakaan, ini dapat membuat perbedaan besar. Kalau tidak, (1) masih berlaku.

Eloff
sumber
59
"Dengan tautan statis, kompiler dapat mengoptimalkan .. kode perpustakaan" tetapi hanya jika ia mengkompilasinya juga! Jika Anda hanya menautkan ke file objek pra-kompilasi, kompiler Anda tidak mendapatkan kesempatan untuk mengoptimalkannya.
3
Jika itu benar, maka Anda benar, tetapi ada beberapa pertanyaan tentang seberapa benar itu dengan kompiler modern, jika seseorang dapat memverifikasi dengan satu atau lain cara ini, itu akan bagus.
Eloff
5
Dengan kompiler kompilasi ke kode asli (seperti kebanyakan kompiler C / C ++) tidak ada peluang lebih lanjut untuk optimasi kode. Jika kode dikompilasi ke beberapa bahasa perantara (seperti .Net IL), kompiler JIT dipanggil ketika pustaka dimuat untuk mengkompilasinya ke kode asli. Kompilasi akhir itu dapat menjadi semakin baik seiring berjalannya waktu ketika kompiler JIT berkembang.
Tarydon
3
@ Eloff: VS2008 melakukan hal itu dengan LTCG diaktifkan. (File lib menjadi sangat besar, meskipun ..) Saya telah mempermainkannya dan bagi seseorang yang tertarik pada "apa yang dapat dilakukan kompiler saya untuk saya", ini sungguh luar biasa.
peterchen

Jawaban:

348
  • Tautan dinamis dapat mengurangi total konsumsi sumber daya (jika lebih dari satu proses berbagi pustaka yang sama (termasuk versi dalam "yang sama", tentu saja)). Saya percaya ini adalah argumen yang mendorong kehadirannya di sebagian besar lingkungan. Di sini "sumber daya" termasuk ruang disk, RAM, dan ruang cache. Tentu saja, jika linker dinamis Anda tidak cukup fleksibel ada risiko neraka DLL .
  • Tautan dinamis berarti perbaikan bug dan peningkatan ke perpustakaan disebarkan untuk meningkatkan produk Anda tanpa mengharuskan Anda mengirim apa pun.
  • Plugin selalu memanggil untuk tautan dinamis .
  • Penghubung statis , artinya Anda dapat mengetahui kode akan berjalan di lingkungan yang sangat terbatas (di awal proses booting, atau dalam mode penyelamatan).
  • Menghubungkan statis dapat membuat biner lebih mudah untuk didistribusikan ke lingkungan pengguna yang beragam (dengan biaya pengiriman program yang lebih besar dan lebih banyak sumber daya).
  • Menghubungkan statis dapat memungkinkan waktu startup yang sedikit lebih cepat , tetapi ini tergantung pada ukuran dan kompleksitas program Anda dan pada detail strategi pemuatan OS.

Beberapa suntingan menyertakan saran yang sangat relevan dalam komentar dan jawaban lainnya. Saya ingin mencatat bahwa cara Anda memecahkan masalah ini sangat tergantung pada lingkungan apa yang Anda rencanakan untuk dijalankan. Sistem seminimal mungkin tidak memiliki sumber daya yang cukup untuk mendukung tautan dinamis. Sistem kecil yang sedikit lebih besar mungkin mendukung tautan dinamis, karena memori mereka cukup kecil untuk membuat penghematan RAM dari tautan dinamis sangat menarik. PC konsumen penuh sesak, seperti yang dicatat Mark, sumber daya yang sangat besar, dan Anda mungkin dapat membiarkan masalah kenyamanan mendorong pemikiran Anda tentang masalah ini.


Untuk mengatasi masalah kinerja dan efisiensi: itu tergantung .

Secara klasik, pustaka dinamis memerlukan semacam lapisan lem yang sering berarti pengiriman ganda atau lapisan tanpa arah tambahan dalam pengalamatan fungsi dan dapat memakan biaya sedikit kecepatan (tetapi apakah fungsi memanggil waktu sebenarnya merupakan bagian besar dari waktu Anda menjalankan ???).

Namun, jika Anda menjalankan banyak proses yang semuanya sering memanggil pustaka yang sama, Anda bisa menghemat garis cache (dan dengan demikian menang saat menjalankan kinerja) saat menggunakan tautan dinamis relatif menggunakan tautan statis. (Kecuali OS modern cukup pintar untuk melihat segmen identik dalam binari yang terhubung secara statis. Tampaknya sulit, ada yang tahu?)

Masalah lain: memuat waktu. Anda membayar biaya pemuatan di beberapa titik. Saat Anda membayar biaya ini tergantung pada cara kerja OS serta tautan apa yang Anda gunakan. Mungkin Anda lebih suka menunda membayarnya sampai Anda tahu Anda membutuhkannya.

Perhatikan bahwa tautan statis-vs-dinamis biasanya bukan masalah pengoptimalan, karena keduanya melibatkan kompilasi terpisah hingga ke file objek. Namun, ini tidak diperlukan: kompiler pada prinsipnya dapat "mengkompilasi" "perpustakaan statis" pada bentuk AST yang dicerna pada awalnya, dan "menautkan" mereka dengan menambahkan AST itu dengan yang dihasilkan untuk kode utama, sehingga memperkuat optimisasi global. Tidak ada sistem yang saya gunakan melakukan ini, jadi saya tidak bisa mengomentari seberapa baik kerjanya.

Cara untuk menjawab pertanyaan kinerja selalu dengan menguji (dan menggunakan lingkungan pengujian sebanyak mungkin seperti lingkungan penyebaran).

dmckee --- mantan kucing moderator
sumber
24
Konsumsi sumber daya pada dasarnya adalah ruang kode, yang seiring berjalannya waktu semakin kurang menjadi perhatian. Jika 500K perpustakaan dibagi antara 5 proses, itu adalah penghematan 2MB, yang kurang dari 0,1% dari 3GB RAM.
Mark Ransom
3
Jika perpustakaan juga berbagi pemetaan virtual yang sama (alamat fisik dan virtual yang sama di semua proses), bukankah tautan dinamis juga menyimpan slot TLB di MMU prosesor?
Zan Lynx
6
Juga tautan dinamis membuatnya mudah untuk memperbarui kode perpustakaan kereta dengan versi yang lebih baik.
Zan Lynx
89
@ Zan Juga memudahkan untuk menambahkan kode buggy ke versi yang berfungsi.
6
"Plugin selalu memanggil tautan dinamis." Itu tidak benar. Beberapa model plugin seperti AudioUnits Apple dapat menjalankan plugin dalam proses terpisah dan menggunakan IPC. Ini adalah alternatif yang lebih aman daripada tautan dinamis untuk plugin (plugin tidak dapat merusak host). Sarankan jawaban diperbarui ke "Plugin mungkin memerlukan tautan dinamis" atau serupa.
Taylor
68

1) didasarkan pada fakta bahwa memanggil fungsi DLL selalu menggunakan lompatan tidak langsung tambahan. Hari ini, ini biasanya diabaikan. Di dalam DLL ada beberapa overhead pada CPU i386, karena mereka tidak dapat menghasilkan kode posisi independen. Pada amd64, lompatan bisa relatif terhadap penghitung program, jadi ini merupakan peningkatan besar.

2) Ini benar. Dengan optimasi yang dipandu oleh profil, Anda biasanya dapat memenangkan sekitar 10-15 persen kinerja. Sekarang kecepatan CPU telah mencapai batasnya, mungkin layak untuk dilakukan.

Saya akan menambahkan: (3) linker dapat mengatur fungsi dalam pengelompokan yang lebih efisien cache, sehingga tingkat cache yang mahal diabaikan. Ini juga mungkin sangat mempengaruhi waktu startup aplikasi (berdasarkan hasil yang saya lihat dengan kompiler Sun C ++)

Dan jangan lupa bahwa dengan DLL tidak ada penghapusan kode mati yang dapat dilakukan. Bergantung pada bahasanya, kode DLL mungkin juga tidak optimal. Fungsi virtual selalu virtual karena kompiler tidak tahu apakah klien menimpanya.

Untuk alasan ini, jika tidak ada kebutuhan nyata untuk DLL, maka gunakan saja kompilasi statis.

EDIT (untuk menjawab komentar, dengan garis bawah pengguna)

Berikut ini adalah sumber yang bagus tentang masalah kode posisi independen http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-share-libraries/

Sebagaimana dijelaskan x86 tidak memilikinya AFAIK untuk hal lain selain rentang lompat 15 bit dan tidak untuk lompatan dan panggilan tanpa syarat. Itu sebabnya fungsi (dari generator) yang memiliki lebih dari 32 ribu selalu menjadi masalah dan membutuhkan trampolin yang disematkan.

Tetapi pada OS x86 populer seperti Linux Anda tidak perlu peduli jika file .so / DLL tidak dihasilkan dengan gccswitch -fpic(yang memberlakukan penggunaan tabel lompat tidak langsung). Karena jika Anda tidak melakukannya, kode itu hanya diperbaiki seperti penghubung biasa akan memindahkannya. Tetapi ketika melakukan ini membuat segmen kode tidak dapat dibagikan dan akan membutuhkan pemetaan penuh kode dari disk ke memori dan menyentuhnya semua sebelum dapat digunakan (mengosongkan sebagian besar cache, memukul TLB) dll. Ada waktu saat ini dianggap lambat.

Jadi Anda tidak akan mendapat manfaat lagi.

Saya tidak ingat apa OS (Solaris atau FreeBSD) memberi saya masalah dengan saya Unix membangun sistem karena saya hanya tidak melakukan hal ini dan bertanya-tanya mengapa jatuh sampai saya diterapkan -fPICuntuk gcc.

Lothar
sumber
4
Saya suka jawaban ini, karena itu adalah satu-satunya untuk mengatasi poin yang saya angkat dalam pertanyaan.
Eloff
Akan menarik untuk memiliki referensi tentang teknis DLL tersebut, dan perbandingan antara sistem operasi yang berbeda.
UncleZeiv
Tampak baik-baik saja, tetapi kecepatan CPU jelas belum mencapai batasnya.
Aidiakapi
67

Tautan dinamis adalah satu-satunya cara praktis untuk memenuhi beberapa persyaratan lisensi seperti LGPL .

Mark tebusan
sumber
17
Selama pengguna akhir dapat terhubung kembali ke kode LGPL (misalnya karena Anda memberikan kode sumber atau file objek yang dikompilasi dengan perangkat lunak Anda), maka tautan statis baik-baik saja . Selain itu, jika perangkat lunak Anda hanya untuk penggunaan internal (yaitu untuk digunakan dalam organisasi Anda saja, dan tidak didistribusikan), maka Anda dapat menautkan secara statis. Ini akan berlaku untuk mis perangkat lunak server, di mana server tidak didistribusikan.
JBentley
3
Jangan paham. Bisakah Anda memberi saya lebih banyak sumber (atau lebih rumit) untuk menghargai apa yang Anda tulis?
Baskaya
4
@Thorn lihat bagian lisensi LGPL 4.d + e . Anda juga perlu mendistribusikan dalam bentuk yang mengharuskan pengguna untuk melakukan tautan, atau mendistribusikan perpustakaan bersama (dinamis).
Mark Ransom
46

Saya setuju dengan poin dnmckee menyebutkan, ditambah:

  • Aplikasi yang terhubung secara statis mungkin lebih mudah untuk digunakan, karena ada lebih sedikit atau tidak ada ketergantungan file tambahan (.dll / .so) yang dapat menyebabkan masalah ketika mereka hilang atau diinstal di tempat yang salah.
stakx - tidak lagi berkontribusi
sumber
6
Perlu dicatat bahwa kompiler Go dari Google hanya akan secara statis mengkompilasi biner karena alasan ini.
Hut8
34

Salah satu alasan untuk melakukan build yang terhubung secara statis adalah untuk memverifikasi bahwa Anda memiliki penutupan penuh untuk dieksekusi, yaitu bahwa semua referensi simbol diselesaikan dengan benar.

Sebagai bagian dari sistem besar yang sedang dibangun dan diuji menggunakan integrasi terus menerus, tes regresi malam dijalankan menggunakan versi yang terhubung secara statis dari executable. Kadang-kadang, kita akan melihat bahwa sebuah simbol tidak akan menyelesaikan dan tautan statis akan gagal meskipun eksekusi yang terhubung secara dinamis akan berhasil terhubung.

Ini biasanya terjadi ketika simbol yang berada jauh di dalam lib bersama memiliki nama yang salah sehingga tidak akan terhubung secara statis. Dynamic linker tidak sepenuhnya menyelesaikan semua simbol, terlepas dari menggunakan evaluasi mendalam-pertama atau luas-pertama, sehingga Anda dapat menyelesaikan dengan executable terkait secara dinamis yang tidak memiliki penutupan penuh.

Rob Wells
sumber
1
poin yang sangat bagus, saya sudah mencoba melakukan ini baru-baru ini dengan beberapa kode yang saya miliki di tempat kerja tetapi mengkompilasi semuanya secara statis terbukti sangat menyebalkan dan saya baru saja menyerah
UncleZeiv
21

1 / Saya pernah mengerjakan proyek di mana penautan dinamis vs penautan statis dipatok dan perbedaannya tidak cukup kecil untuk beralih ke penautan dinamis (saya bukan bagian dari tes, saya hanya tahu kesimpulannya)

2 / Tautan dinamis sering dikaitkan dengan PIC (Position Independent Code, kode yang tidak perlu dimodifikasi tergantung pada alamat di mana ia dimuat). Bergantung pada arsitektur, PIC dapat membawa perlambatan lain tetapi diperlukan untuk mendapatkan manfaat dari berbagi pustaka yang terhubung secara dinamis antara dua yang dapat dieksekusi (dan bahkan dua proses yang dapat dieksekusi yang sama jika OS menggunakan pengacakan alamat beban sebagai ukuran keamanan). Saya tidak yakin bahwa semua OS memungkinkan untuk memisahkan dua konsep, tetapi Solaris dan Linux melakukan dan ISTR yang dilakukan HP-UX juga.

3 / Saya pernah mengerjakan proyek lain yang menggunakan tautan dinamis untuk fitur "tambalan mudah". Tapi ini "tambalan mudah" membuat distribusi perbaikan kecil sedikit lebih mudah dan rumit satu mimpi buruk versi. Kami sering berakhir dengan harus mendorong segalanya dan harus melacak masalah di situs pelanggan karena versi yang salah adalah token.

Kesimpulan saya adalah bahwa saya menggunakan tautan statis yang dikecualikan:

  • untuk hal-hal seperti plugin yang bergantung pada tautan dinamis

  • ketika berbagi itu penting (pustaka besar yang digunakan oleh banyak proses pada saat yang sama seperti runtime C / C ++, pustaka GUI, ... yang sering dikelola secara independen dan ABI didefinisikan dengan ketat)

Jika seseorang ingin menggunakan "tambalan mudah", saya berpendapat bahwa perpustakaan harus dikelola seperti perpustakaan besar di atas: mereka harus hampir independen dengan ABI yang ditentukan yang tidak boleh diubah oleh perbaikan.

Pemrogram
sumber
1
Beberapa OS untuk prosesor non-PIC atau mahal-PIC akan menyiapkan pustaka dinamis untuk dimuat pada alamat tertentu dalam memori, dan jika mereka dapat melakukannya, mereka hanya memetakan dalam salinan pustaka untuk setiap proses yang terhubung dengannya. Itu mengurangi overhead PIC banyak. Setidaknya OS X dan beberapa distribusi Linux melakukan ini, saya tidak yakin tentang Windows.
Andrew McGregor
Terima kasih Andrew, saya tidak tahu bahwa beberapa distribusi Linux menggunakan ini. Apakah Anda memiliki referensi yang dapat saya ikuti atau kata kunci yang dapat saya cari untuk mempelajari lebih lanjut? (FWIW saya pernah mendengar bahwa Windows melakukan varian ini, tetapi Windows terlalu jauh dari zona kompetensi saya untuk saya sebutkan).
Pemrogram
Saya pikir kata kunci yang Anda cari adalah "prelink" - itu menyiapkan perpustakaan untuk dimuat dengan cepat di alamat tertentu, untuk membuat startup program lebih cepat.
Blaisorblade
20

Ini membahas dengan sangat rinci tentang perpustakaan bersama di linux dan implikasi kinerja.

tidak
sumber
3
+1 untuk menghubungkan ke Drepper DSO howto, yang harus dibaca oleh semua orang yang membuat perpustakaan di Linux.
janneb
10

Pada sistem mirip Unix, penautan dinamis dapat mempersulit 'root' untuk menggunakan aplikasi dengan pustaka bersama yang dipasang di lokasi yang tidak terjangkau. Ini karena tautan dinamis umumnya tidak akan memperhatikan LD_LIBRARY_PATH atau yang setara untuk proses dengan hak akses root. Terkadang, tautan statis menghemat hari.

Atau, proses instalasi harus menemukan perpustakaan, tetapi itu bisa menyulitkan beberapa versi perangkat lunak untuk hidup berdampingan pada mesin.

Jonathan Leffler
sumber
1
Maksudnya LD_LIBRARY_PATHbukanlah hambatan untuk menggunakan perpustakaan bersama, setidaknya tidak di GNU / Linux. Misalnya jika Anda meletakkan pustaka bersama di direktori ../lib/relatif ke file program, maka dengan rantai alat GNU opsi linker -rpath $ORIGIN/../libakan menentukan pencarian pustaka dari lokasi relatif itu. Anda kemudian dapat dengan mudah memindahkan aplikasi bersama dengan semua pustaka bersama yang terkait. Menggunakan trik ini, tidak ada masalah memiliki beberapa versi aplikasi dan pustaka baik (dengan asumsi mereka terkait, jika tidak Anda bisa menggunakan tautan simbolik).
FooF
> untuk proses dengan hak akses root. Saya pikir Anda berbicara tentang program setuid dijalankan dari pengguna non-root - jika tidak masuk akal. Dan binary setuid dengan perpustakaan di lokasi non-standar aneh - tetapi karena hanya root yang dapat menginstal program-program itu, ia juga dapat mengedit /etc/ld.so.confuntuk kasus itu.
Blaisorblade
10

Ini sangat sederhana, sungguh. Ketika Anda membuat perubahan dalam kode sumber Anda, apakah Anda ingin menunggu 10 menit untuk membangun atau 20 detik? Hanya 20 detik yang bisa saya pakai. Di luar itu, saya mengeluarkan pedang atau mulai berpikir tentang bagaimana saya dapat menggunakan kompilasi terpisah dan menghubungkannya untuk membawanya kembali ke zona nyaman.

Hans Passant
sumber
1
Saya belum benar-benar membandingkan perbedaan dalam kecepatan kompilasi, tetapi saya akan menghubungkan dinamis jika secara signifikan lebih cepat. Boost melakukan cukup banyak hal buruk pada waktu kompilasi saya apa adanya.
Eloff
9

Contoh terbaik untuk penautan dinamis adalah, ketika perpustakaan bergantung pada perangkat keras yang digunakan. Pada zaman kuno perpustakaan C matematika diputuskan bersifat dinamis, sehingga setiap platform dapat menggunakan semua kemampuan prosesor untuk mengoptimalkannya.

Contoh yang lebih baik lagi adalah OpenGL. OpenGl adalah API yang diimplementasikan secara berbeda oleh AMD dan NVidia. Dan Anda tidak dapat menggunakan implementasi NVidia pada kartu AMD, karena perangkat kerasnya berbeda. Anda tidak dapat menautkan OpenGL secara statis ke program Anda, karena itu. Tautan dinamis digunakan di sini untuk memungkinkan API dioptimalkan untuk semua platform.

Arne
sumber
8

Menghubungkan dinamis memerlukan waktu ekstra bagi OS untuk menemukan perpustakaan dinamis dan memuatnya. Dengan penghubung statis, semuanya bersama-sama dan ini adalah satu tembakan ke memori.

Juga, lihat Neraka DLL . Ini adalah skenario di mana DLL yang memuat OS bukan yang datang dengan aplikasi Anda, atau versi yang diharapkan aplikasi Anda.

Thomas Matthews
sumber
1
Penting untuk dicatat bahwa ada berbagai tindakan pencegahan untuk menghindari Neraka DLL.
ocodo
5

Masalah lain yang belum dibahas adalah memperbaiki bug di perpustakaan.

Dengan tautan statis, Anda tidak hanya harus membangun kembali perpustakaan, tetapi juga harus menautkan kembali dan mendistribusikan kembali yang dapat dieksekusi. Jika perpustakaan hanya digunakan dalam satu executable, ini mungkin tidak menjadi masalah. Tetapi semakin banyak yang dapat dieksekusi yang perlu ditata kembali dan didistribusikan, semakin besar rasa sakitnya.

Dengan tautan dinamis, Anda hanya membangun kembali dan mendistribusikan kembali perpustakaan dinamis dan Anda selesai.

R Samuel Klatchko
sumber
2

tautan statis memberi Anda hanya satu exe, inorder untuk membuat perubahan yang Anda butuhkan untuk mengkompilasi ulang seluruh program Anda. Sedangkan dalam penautan dinamis Anda perlu membuat perubahan hanya ke dll dan ketika Anda menjalankan exe Anda, perubahan akan diambil saat runtime. Lebih mudah untuk memberikan pembaruan dan perbaikan bug dengan tautan dinamis (misalnya: windows).

Govardhan Murali
sumber
2

Ada sejumlah besar dan semakin banyak sistem di mana tingkat penghubung statis yang ekstrem dapat memiliki dampak positif yang sangat besar pada aplikasi dan kinerja sistem.

Saya merujuk pada apa yang sering disebut "embedded system", banyak di antaranya sekarang semakin menggunakan sistem operasi untuk tujuan umum, dan sistem ini digunakan untuk segala yang dapat dibayangkan.

Contoh yang sangat umum adalah perangkat yang menggunakan sistem GNU / Linux menggunakan Busybox . Saya telah mengambil ini secara ekstrim dengan NetBSD dengan membangun image sistem i386 (32-bit) yang dapat di-boot yang mencakup kernel dan filesystem root-nya, yang terakhir yang berisi satu crunchgenbiner yang dihubungkan dengan statis tunggal (dengan ) dengan tautan keras ke semua program itu sendiri berisi semua (baik pada hitungan terakhir 274) dari program sistem fitur lengkap standar (kebanyakan kecuali toolchain), dan ukurannya kurang dari 20 mega byte (dan mungkin berjalan sangat nyaman dalam sistem dengan hanya 64MB memori (bahkan dengan sistem file root tidak terkompresi dan seluruhnya dalam RAM), meskipun saya belum dapat menemukan satu yang sangat kecil untuk mengujinya).

Telah disebutkan dalam posting sebelumnya bahwa waktu start-up dari binari yang terhubung statis lebih cepat (dan itu bisa jauh lebih cepat), tetapi itu hanya sebagian dari gambar, terutama ketika semua kode objek dihubungkan ke dalam yang sama file, dan bahkan lebih terutama ketika sistem operasi mendukung permintaan paging kode langsung dari file yang dapat dieksekusi. Dalam skenario ideal ini waktu startup program secara harfiah dapat diabaikan karena hampir semua halaman kode sudah ada dalam memori dan digunakan oleh shell (dan initproses latar belakang lainnya yang mungkin sedang berjalan), bahkan jika program yang diminta belum pernah dijalankan sejak boot karena mungkin hanya satu halaman memori perlu dimuat untuk memenuhi persyaratan runtime program.

Namun itu masih belum keseluruhan cerita. Saya juga biasanya membangun dan menggunakan instalasi sistem operasi NetBSD untuk sistem pengembangan penuh saya dengan menghubungkan semua binari secara statis. Meskipun ini membutuhkan lebih banyak ruang disk yang lebih besar (~ total 6.6GB untuk x86_64 dengan segalanya, termasuk toolchain dan X11 yang terhubung statis) (terutama jika seseorang menyimpan tabel simbol debug penuh tersedia untuk semua program lain ~ 2.5GB), hasilnya masih berjalan lebih cepat secara keseluruhan, dan untuk beberapa tugas bahkan menggunakan memori lebih sedikit daripada sistem yang terhubung-dinamis khas yang dimaksudkan untuk berbagi halaman kode perpustakaan. Disk itu murah (bahkan fast disk), dan memori ke cache yang sering digunakan file disk juga relatif murah, tetapi siklus CPU sebenarnya tidak, dan membayar ld.sobiaya startup untuk setiap proses yang dimulai setiapwaktu mulai akan mengambil jam dan siklus siklus CPU jauh dari tugas yang memerlukan memulai banyak proses, terutama ketika program yang sama digunakan berulang-ulang, seperti kompiler pada sistem pengembangan. Program-program toolchain terkait statis dapat mengurangi waktu membangun multi-arsitektur seluruh OS untuk sistem saya selama berjam-jam . Saya belum membuat toolchain ke dalam crunchgenbiner tunggal saya , tetapi saya curiga kalau saya lakukan, akan ada lebih banyak waktu untuk membangun waktu karena kemenangan untuk cache CPU.

Greg A. Woods
sumber
2

Menghubungkan statis termasuk file yang dibutuhkan program dalam satu file yang dapat dieksekusi.

Tautan dinamis adalah apa yang Anda anggap biasa, itu membuat executable yang masih memerlukan DLL dan semacamnya berada di direktori yang sama (atau DLL bisa berada di folder sistem).

(DLL = perpustakaan tautan dinamis )

Eksekusi yang terhubung secara dinamis disusun lebih cepat dan tidak terlalu banyak sumber daya.

Nykal
sumber
0

Static linking adalah proses dalam waktu kompilasi ketika konten yang ditautkan disalin ke dalam biner primer dan menjadi satu biner.

Cons:

  • waktu kompilasi lebih lama
  • biner keluaran lebih besar

Dynamic linkingadalah proses runtime ketika konten yang ditautkan dimuat. Teknik ini memungkinkan untuk:

  • tingkatkan biner yang tertaut tanpa mengkompilasi ulang yang utama yang meningkatkan ABIstabilitas [Tentang]
  • memiliki satu salinan bersama

Cons:

  • waktu mulai lebih lambat (konten tertaut harus disalin)
  • kesalahan tautan dilemparkan ke dalam runtime
yoAlex5
sumber