Untuk mengkompilasi paket perangkat lunak pada workstation dengan banyak core CPU (katakanlah 12), tahap konfigurasi seringkali memakan waktu lebih lama daripada tahap kompilasi yang sebenarnya karena ./configure
melakukan pengujian satu per satu, saat make -j
dijalankan gcc
serta perintah lain secara paralel.
Saya merasa bahwa itu adalah pemborosan sumber daya yang besar untuk membiarkan 11 core yang tersisa duduk diam sebagian besar waktu menunggu yang lambat ./configure
untuk diselesaikan. Mengapa perlu melakukan tes secara berurutan? Apakah setiap tes tergantung satu sama lain? Saya bisa saja salah, tetapi sepertinya mayoritas dari mereka independen.
Lebih penting lagi, apakah ada cara untuk mempercepat ./configure
?
Sunting: Untuk mengilustrasikan situasinya, berikut adalah contoh dengan GNU Coreutils
cd /dev/shm
rm -rf coreutils-8.9
tar -xzf coreutils-8.9.tar.gz
cd coreutils-8.9
time ./configure
time make -j24
Hasil:
# For `time ./configure`
real 4m39.662s
user 0m26.670s
sys 4m30.495s
# For `time make -j24`
real 0m42.085s
user 2m35.113s
sys 6m15.050s
Dengan coreutils-8.9 , ./configure
membutuhkan waktu 6 kali lebih lama dari make
. Meskipun ./configure
menggunakan lebih sedikit waktu CPU (lihat waktu "pengguna" & "sys"), ini membutuhkan waktu lebih lama ("nyata") karena tidak diparalelkan. Saya telah mengulangi pengujian beberapa kali (dengan file yang relevan mungkin tinggal di cache memori) dan waktunya berada dalam 10%.
sumber
Jawaban:
Saya ingat diskusi di milis Autoconf tentang masalah ini dari sekitar 10 tahun yang lalu, ketika kebanyakan orang sebenarnya hanya memiliki satu inti CPU. Tapi tidak ada yang dilakukan, dan saya curiga tidak ada yang dilakukan. Akan sangat sulit untuk mengatur semua dependensi untuk pemrosesan paralel
configure
, dan melakukannya dengan cara yang portabel dan kuat.Tergantung pada skenario khusus Anda, mungkin ada beberapa cara untuk mempercepat proses konfigurasi. Sebagai contoh:
dash
alih-alihbash
sebagai/bin/sh
. (Catatan: Di bawah Debian,dash
ditambal sehinggaconfigure
tidak menggunakannya, karena menggunakannya merusak banyakconfigure
skrip.)configure -q
.configure -C
. Lihat dokumentasi Autoconf untuk detailnya.config.site
). Sekali lagi, lihat dokumentasi.sumber
make
bisa diparalelkanconfigure
atauautoconf
tidak?sh -c "echo $i" > /dev/null
1000 kali membutuhkan sekitar 10 detik pada sistem ini, tetapi hanya 1-2 detik pada sistem saya yang lain.configure
pengujian sebenarnya adalah operasi dengan kompleksitas rendah (jenis topologi) dan telah dipecahkan pada awal-awal komputasi. Masalah sebenarnya adalah tidak ada yang mau repot-repot menambahkan kode ke autoconf untuk melakukannya dan fakta bahwa banyak programmer secara manual memodifikasi file yang dihasilkan. Seluruh sistem harus dirubah sehingga konfigurasi tidak lagi dilakukan oleh skrip shell tetapi biner penduduk yang membaca file data meta.Anda telah pintar menggunakan ramdrive agar sourcetree berada, tetapi pikirkan dua kali - apa yang dikonfigurasikan lakukan? Itu melakukan pekerjaannya dengan memeriksa tidak hanya Anda sourcetree , tapi cukup sering juga sistem untuk ketersediaan perpustakaan, kompiler, dll Dalam hal ini, masalah akses kadang-kadang berada di akses disk - Anda akan memiliki itu dilakukan lebih cepat jika Anda memiliki untuk contoh sistem file root berbasis SSD.
sumber
./configure
berulang kali, tetapi proses selanjutnya hampir memakan waktu menjalankan pertama. Karena ada banyak memori bebas dalam sistem, saya pikir sistem menjalankan kompiler dan perpustakaan dari cache memori tanpa pergi ke disk../configure
selalu berjalan di pohon sumber yang baru diekstrak). Saya akan menambahkan rincian lebih lanjut di pos asli (ruang terbatas di sini)../configure
segera setelah yang lain./configure
) dan keduanya berjalan membutuhkan waktu yang sama. Apakah ini berarti caching tidak berfungsi mungkin pada sistem saya?Jika Anda menggunakan gubernur cpu ondemand, coba gunakan yang kinerja. Ini membantu pada i7 dan a8-3850 sebesar 40-50%. Tidak membuat banyak perbedaan pada q9300.
Pada quad core cpu, Anda mungkin melakukannya
(Opsi -r harus membuatnya sehingga Anda tidak perlu melakukan cpufreq-set untuk setiap inti, tetapi di komputer saya itu tidak berfungsi.)
Opsi cache bahkan lebih membantu.
sumber
Ada banyak jenis
./configure
skrip. Ada alat-alat populer ( autconf menjadi salah satunya) untuk membantu pengembang dalam membuat./configure
skrip, tetapi tidak ada aturan yang mengatakan setiap pengembang harus menggunakan alat ini, dan bahkan di antara alat-alat ini, dapat ada variasi yang luas dalam cara skrip ini dibangun.Saya tidak mengetahui adanya
./configure
skrip populer yang dapat dijalankan secara paralel. Sebagian besar skrip yang dibuat oleh alat-alat populer setidaknya melakukan cache beberapa atau semua hasil mereka, jadi jika Anda menjalankannya lagi (tanpa melakukan yangmake clean
pertama, bagaimanapun), itu berjalan lebih cepat untuk yang kedua kalinya.Itu bukan untuk mengatakan itu tidak dapat dilakukan ... tapi saya curiga ada sedikit motivasi bagi orang yang bekerja
autoconf
, misalnya, untuk melakukan itu, karena untuk sebagian besar paket, tahap konfigurasi sangat cepat relatif terhadap kompilasi aktual dan menghubungkan fase.sumber
Hard drive adalah hambatan dalam hal ini. Untuk mempercepat pembangunan, bangun sistem dengan drive cepat (baca: waktu akses rendah). Ada banyak keributan tentang cakram SSD, tetapi ada beberapa kritik mengenai mereka yang tidak mempengaruhi waktu kompilasi secara positif. Artinya membangun SSD tidak jauh lebih cepat daripada pada drive sata yang layak. Saya tidak ingat di mana saya membaca ini karena artikel ini berumur beberapa tahun.
Ngomong-ngomong ... Untar untuk ram dan membangun dari sana.
sumber
Pertanyaan Anda bahkan mungkin lebih relevan hari ini karena kami memiliki selusin-inti CPU dengan (kinerja) inti tunggal yang rendah. Build otomatis untuk Continuous Integration (CI) benar-benar membuang banyak waktu CPU / energi untuk setiap komit. Sama dengan melompat antar cabang.
Jadi tinjau / baca petunjuk saya tentang mempercepat hal itu di https://gitlab.com/gnuwget/wget2/wikis/Developer-hints:-Increasing-speed-of-GNU-toolchain .
"Mengapa perlu melakukan tes secara berurutan? ..." Sebenarnya ada beberapa hal yang dapat dilakukan secara paralel, sementara yang lain harus berurutan. Beberapa hal tergantung pada lingkungan build - dan skrip configure itu sendiri adalah sistem independen. Bahkan tidak mengandung bashism, jadi ia bekerja dengan shell POSIX murni.
Jika Anda ingin menulis perangkat lunak portabel, tidak ada sistem build lain seperti autotools. Tetapi jika Anda tidak keberatan dengan portabilitas (lebar), hindari autotool - ada banyak alat pembuatan yang cepat dan cukup bagus.
sumber