Saya tahu ini bukan pertanyaan pemrograman tetapi relevan.
Saya bekerja pada proyek lintas platform yang cukup besar . Di Windows saya menggunakan VC ++ 2008. Di Linux saya menggunakan gcc. Ada sekitar 40 ribu file dalam proyek ini. Windows 10x hingga 40x lebih lambat dari Linux dalam menyusun dan menautkan proyek yang sama. Bagaimana saya bisa memperbaikinya?
Satu perubahan tambahan dilakukan selama 20 detik di Linux dan> 3 menit di Windows. Mengapa? Saya bahkan dapat menginstal tautan 'emas' di Linux dan menurunkan waktu ke 7 detik.
Demikian pula git 10x hingga 40x lebih cepat di Linux daripada Windows.
Dalam kasus git itu mungkin git tidak menggunakan Windows secara optimal tetapi VC ++? Anda akan berpikir Microsoft ingin membuat pengembang mereka sendiri seproduktif mungkin dan kompilasi yang lebih cepat akan sangat membantu. Mungkin mereka mencoba mendorong pengembang ke C #?
Sebagai tes sederhana, cari folder dengan banyak subfolder dan lakukan yang sederhana
dir /s > c:\list.txt
di Windows. Lakukan dua kali dan waktu jalankan kedua sehingga berjalan dari cache. Salin file ke Linux dan lakukan 2 setara menjalankan dan waktu menjalankan kedua.
ls -R > /tmp/list.txt
Saya memiliki 2 workstation dengan spesifikasi yang sama persis. HP Z600s dengan 12gig ram, 8 core di 3.0ghz. Pada folder dengan ~ 400 ribu file, Windows membutuhkan waktu 40 detik, Linux membutuhkan waktu <1 detik.
Apakah ada pengaturan registri yang dapat saya atur untuk mempercepat Windows? Apa yang menyebabkannya?
Beberapa tautan yang sedikit relevan, relevan dengan waktu kompilasi, belum tentu i / o.
Rupanya ada masalah di Windows 10 (bukan di Windows 7) bahwa penutupan suatu proses memegang kunci global . Ketika mengkompilasi dengan beberapa inti dan karenanya banyak proses, masalah ini muncul.
The
/analyse
pilihan dapat mempengaruhi kinerja itu karena beban web browser . (Tidak relevan di sini, tetapi baik untuk diketahui)
Jawaban:
Kecuali seorang peretas sistem Windows hardcore datang, Anda tidak akan mendapatkan lebih dari komentar partisan (yang tidak akan saya lakukan) dan spekulasi (yang akan saya coba).
Sistem file - Anda harus mencoba operasi yang sama (termasuk
dir
) pada sistem file yang sama. Saya menemukan ini yang menandai beberapa filesystem untuk berbagai parameter.Caching. Saya pernah mencoba menjalankan kompilasi di Linux pada disk RAM dan menemukan bahwa itu lebih lambat daripada menjalankannya pada disk berkat cara kernel menangani caching. Ini adalah titik penjualan yang kuat untuk Linux dan mungkin menjadi alasan mengapa kinerjanya sangat berbeda.
Spesifikasi ketergantungan buruk pada Windows. Mungkin spesifikasi ketergantungan kromium untuk Windows tidak seakurat untuk Linux. Ini mungkin menghasilkan kompilasi yang tidak perlu saat Anda melakukan perubahan kecil. Anda mungkin dapat memvalidasi ini menggunakan toolchain compiler yang sama pada Windows.
sumber
Beberapa ide:
fsutil behavior set disable8dot3 1
fsutil behavior set mftzone 2
Ubah angka terakhir menjadi 3 atau 4 untuk menambah ukuran dengan tambahan 12,5% tambahan. Setelah menjalankan perintah, reboot dan kemudian buat sistem file.fsutil behavior set disablelastaccess 1
fsutil behavior set memoryusage 2
sumber
NTFS menghemat waktu akses file setiap saat. Anda dapat mencoba menonaktifkannya: "perilaku fsutil atur disablelastaccess 1" (mulai ulang)
sumber
Masalah dengan visual c ++, sejauh yang saya tahu, itu bukan prioritas bagi tim penyusun untuk mengoptimalkan skenario ini. Solusi mereka adalah Anda menggunakan fitur header yang sudah dikompilasi. Inilah yang telah dilakukan proyek-proyek spesifik windows. Ini tidak portabel, tetapi berfungsi.
Selain itu, pada windows Anda biasanya memiliki pemindai virus, serta alat pemulihan sistem dan pencarian yang dapat merusak waktu pembuatan Anda sepenuhnya jika mereka memantau folder buid untuk Anda. monitor windows 7 sumber daya dapat membantu Anda menemukannya. Saya punya balasan di sini dengan beberapa tips lebih lanjut untuk mengoptimalkan waktu membangun vc ++ jika Anda benar-benar tertarik.
sumber
Saya pribadi menemukan menjalankan mesin virtual windows di linux berhasil menghapus banyak kelambatan IO di windows, kemungkinan karena vm linux melakukan banyak caching bahwa Windows itu sendiri tidak.
Melakukan hal itu saya dapat mempercepat waktu kompilasi proyek C ++ besar (250Kloc) yang saya kerjakan dari sekitar 15 menit hingga sekitar 6 menit.
sumber
Kesulitan dalam melakukan itu adalah karena fakta bahwa C ++ cenderung menyebar sendiri dan proses kompilasi pada banyak file kecil, individual. Itu adalah sesuatu yang baik untuk Linux dan Windows tidak. Jika Anda ingin membuat kompiler C ++ yang sangat cepat untuk Windows, coba simpan semuanya dalam RAM dan sentuh sistem file sesedikit mungkin.
Itu juga bagaimana Anda akan membuat rantai kompilasi Linux C ++ yang lebih cepat, tetapi kurang penting di Linux karena sistem file sudah melakukan banyak penyetelan untuk Anda.
Alasan untuk ini adalah karena budaya Unix: Secara historis kinerja sistem file telah menjadi prioritas yang jauh lebih tinggi di dunia Unix daripada di Windows. Bukan untuk mengatakan bahwa itu belum menjadi prioritas di Windows, hanya saja di Unix itu telah menjadi prioritas yang lebih tinggi.
Akses ke kode sumber.
Anda tidak dapat mengubah apa yang tidak dapat Anda kendalikan. Kurangnya akses ke kode sumber Windows NTFS berarti bahwa sebagian besar upaya untuk meningkatkan kinerja telah melalui perbaikan perangkat keras. Artinya, jika kinerjanya lambat, Anda mengatasi masalah dengan meningkatkan perangkat keras: bus, media penyimpanan, dan sebagainya. Anda hanya dapat melakukan banyak hal jika Anda harus mengatasi masalah, bukan memperbaikinya.
Akses ke kode sumber Unix (bahkan sebelum open source) lebih luas. Karena itu, jika Anda ingin meningkatkan kinerja, Anda harus mengatasinya dalam perangkat lunak terlebih dahulu (lebih murah dan lebih mudah) dan perangkat keras kedua.
Akibatnya, ada banyak orang di dunia yang mendapatkan gelar PhD dengan mempelajari sistem file Unix dan menemukan cara baru untuk meningkatkan kinerja.
Unix cenderung ke banyak file kecil; Windows cenderung ke arah beberapa (atau satu) file besar.
Aplikasi Unix cenderung menangani banyak file kecil. Pikirkan lingkungan pengembangan perangkat lunak: banyak file sumber kecil, masing-masing dengan tujuan mereka sendiri. Tahap terakhir (menautkan) membuat satu file besar tetapi itu adalah persentase kecil.
Akibatnya, Unix memiliki panggilan sistem yang sangat dioptimalkan untuk membuka dan menutup file, memindai direktori, dan sebagainya. Sejarah makalah penelitian Unix mencakup beberapa dekade optimasi sistem file yang menaruh banyak pemikiran dalam meningkatkan akses direktori (pencarian dan pemindaian direktori penuh), pembukaan file awal, dan sebagainya.
Aplikasi Windows cenderung membuka satu file besar, tahan terbuka lama, tutup ketika selesai. Pikirkan MS-Word. msword.exe (atau apa pun) membuka file sekali dan menambahkan selama berjam-jam, memperbarui blok internal, dan sebagainya. Nilai mengoptimalkan pembukaan file akan terbuang waktu.
Sejarah benchmarking dan optimisasi Windows adalah seberapa cepat seseorang dapat membaca atau menulis file yang panjang. Itulah yang dioptimalkan.
Sayangnya pengembangan perangkat lunak cenderung mengarah pada situasi pertama. Heck, sistem pengolah kata terbaik untuk Unix (TeX / LaTeX) mendorong Anda untuk menempatkan setiap bab dalam file yang berbeda dan # memasukkan semuanya.
Unix berfokus pada kinerja tinggi; Windows berfokus pada pengalaman pengguna
Unix dimulai di ruang server: tidak ada antarmuka pengguna. Satu-satunya hal yang dilihat pengguna adalah kecepatan. Karena itu, kecepatan adalah prioritas.
Windows dimulai pada desktop: Pengguna hanya peduli dengan apa yang mereka lihat, dan mereka melihat UI. Oleh karena itu, lebih banyak energi dihabiskan untuk meningkatkan UI daripada kinerja.
Ekosistem Windows tergantung pada keusangan yang direncanakan. Mengapa mengoptimalkan perangkat lunak ketika perangkat keras baru hanya satu atau dua tahun lagi?
Saya tidak percaya pada teori konspirasi tetapi jika saya melakukannya, saya akan menunjukkan bahwa dalam budaya Windows ada lebih sedikit insentif untuk meningkatkan kinerja. Model bisnis Windows tergantung pada orang yang membeli mesin baru seperti jarum jam. (Itu sebabnya harga saham ribuan perusahaan terpengaruh jika MS mengirimkan sistem operasi terlambat atau jika Intel melewatkan tanggal rilis chip.). Ini berarti ada insentif untuk menyelesaikan masalah kinerja dengan menyuruh orang membeli perangkat keras baru; bukan dengan memperbaiki masalah sebenarnya: sistem operasi yang lambat. Unix berasal dari akademisi di mana anggarannya ketat dan Anda bisa mendapatkan PhD dengan menciptakan cara baru untuk membuat sistem file lebih cepat; jarang seseorang di dunia akademis mendapatkan poin untuk memecahkan masalah dengan mengeluarkan pesanan pembelian.
Juga, karena Unix adalah open source (bahkan ketika tidak, semua orang memiliki akses ke sumber) setiap mahasiswa PhD yang bosan dapat membaca kode dan menjadi terkenal dengan membuatnya lebih baik. Itu tidak terjadi di Windows (MS memang memiliki program yang memberikan akses akademis ke kode sumber Windows, jarang dimanfaatkan). Lihatlah pilihan makalah kinerja terkait Unix ini: http://www.eecs.harvard.edu/margo/papers/ atau lihat sejarah makalah oleh Osterhaus, Henry Spencer, atau lainnya. Heck, salah satu perdebatan terbesar (dan paling menyenangkan untuk ditonton) dalam sejarah Unix adalah bolak-balik antara Osterhaus dan Selzer http://www.eecs.harvard.edu/margo/papers/usenix95-lfs/supplement/rebuttal. html Anda tidak melihat hal semacam itu terjadi di dunia Windows. Anda mungkin melihat vendor saling mendukung, tetapi yang tampaknya jauh lebih jarang akhir-akhir ini karena inovasi tampaknya semua berada pada level standar badan.
Begitulah cara saya melihatnya.
Pembaruan: Jika Anda melihat rantai kompiler baru yang keluar dari Microsoft, Anda akan sangat optimis karena banyak dari apa yang mereka lakukan membuatnya lebih mudah untuk menjaga seluruh rantai alat dalam RAM dan mengulangi lebih sedikit pekerjaan. Hal yang sangat mengesankan.
sumber
Tautan tambahan
Jika solusi VC 2008 diatur sebagai beberapa proyek dengan output .lib, Anda perlu mengatur "Gunakan Input Ketergantungan Perpustakaan"; ini membuat tautan tautan langsung terhadap file .obj daripada .lib. (Dan sebenarnya membuatnya terhubung secara bertahap.)
Kinerja direktori traversal
Agak tidak adil untuk membandingkan perayapan direktori pada mesin asli dengan merayapi direktori yang baru dibuat dengan file yang sama di komputer lain. Jika Anda menginginkan tes yang setara, Anda mungkin harus membuat salinan direktori lain pada mesin sumber. (Mungkin masih lambat, tapi itu bisa disebabkan oleh sejumlah hal: fragmentasi disk, nama file pendek, layanan latar belakang, dll.) Meskipun saya pikir masalah perf
dir /s
lebih berkaitan dengan menulis output daripada mengukur file aktual kinerja traversal. Bahkandir /s /b > nul
lambat di mesin saya dengan direktori besar.sumber
Saya cukup yakin ini terkait dengan sistem file. Saya bekerja pada proyek lintas platform untuk Linux dan Windows di mana semua kode adalah umum kecuali untuk di mana kode tergantung pada platform mutlak diperlukan. Kami menggunakan Mercurial, bukan git, jadi "Linuxness" dari git tidak berlaku. Menarik perubahan dari repositori pusat membutuhkan waktu yang lama di Windows dibandingkan dengan Linux, tetapi saya harus mengatakan bahwa mesin Windows 7 kami melakukan jauh lebih baik daripada yang Windows XP. Kompilasi kode setelah itu bahkan lebih buruk pada VS 2008. Ini bukan hanya hg; CMake berjalan jauh lebih lambat di Windows juga, dan kedua alat ini menggunakan sistem file lebih dari apa pun.
Masalahnya sangat buruk sehingga sebagian besar pengembang kami yang bekerja di lingkungan Windows bahkan tidak repot-repot melakukan pembangunan bertahap lagi - mereka menemukan bahwa melakukan pembangunan kesatuan justru lebih cepat.
Kebetulan, jika Anda ingin secara dramatis mengurangi kecepatan kompilasi di Windows, saya sarankan build kesatuan yang disebutkan di atas. Ini adalah rasa sakit untuk menerapkan dengan benar dalam sistem build (saya melakukannya untuk tim kami di CMake), tetapi sekali dilakukan secara otomatis mempercepat segalanya untuk server integrasi berkelanjutan kami. Bergantung pada berapa banyak binari yang dibuat oleh sistem build Anda, Anda bisa mendapatkan 1 hingga 2 peningkatan pesanan. Jarak tempuh Anda mungkin beragam. Dalam kasus kami, saya pikir itu mempercepat Linux membangun tiga kali lipat dan Windows satu dengan faktor 10, tapi kami memiliki banyak perpustakaan dan executable bersama (yang mengurangi keuntungan dari membangun kesatuan).
sumber
Bagaimana Anda membangun proyek lintas platform besar Anda? Jika Anda menggunakan makefile umum untuk Linux dan Windows Anda dapat dengan mudah menurunkan kinerja windows dengan faktor 10 jika makefile tidak dirancang untuk menjadi cepat pada Windows.
Saya baru saja memperbaiki beberapa makefile dari proyek lintas platform menggunakan makefile umum (GNU) untuk Linux dan Windows. Make sedang memulai
sh.exe
proses untuk setiap baris resep yang menyebabkan perbedaan kinerja antara Windows dan Linux!Menurut GNU membuat dokumentasi
harus menyelesaikan masalah, tetapi fitur ini (saat ini) tidak didukung untuk Windows make. Jadi menulis ulang resep menjadi satu baris logis (misalnya dengan menambahkan; \ atau \ pada akhir baris editor saat ini) bekerja dengan sangat baik!
sumber
IMHO ini semua tentang kinerja disk I / O. Urutan besarnya menyarankan banyak operasi masuk ke disk di bawah Windows sedangkan mereka ditangani dalam memori di Linux, yaitu Linux caching lebih baik. Pilihan terbaik Anda di bawah windows adalah memindahkan file Anda ke disk cepat, server atau sistem file. Pertimbangkan untuk membeli Solid State Drive atau memindahkan file Anda ke ramdisk atau server NFS cepat.
Saya menjalankan tes direktori traversal dan hasilnya sangat dekat dengan waktu kompilasi yang dilaporkan, menunjukkan ini tidak ada hubungannya dengan waktu pemrosesan CPU atau algoritma kompiler / linker sama sekali.
Waktu yang diukur seperti yang disarankan di atas melintasi pohon direktori kromium:
Untuk tes saya menarik sumber kromium (keduanya di bawah win / linux)
Untuk mengukur waktu saya berlari
Saya mematikan cap waktu akses, pemindai virus saya dan meningkatkan pengaturan cache manager di bawah windows (> 2Gb RAM) - semua tanpa perbaikan nyata. Faktanya adalah, di luar kotak Linux berperforma 50x lebih baik daripada Windows dengan seperempat dari RAM.
Bagi siapa saja yang ingin menyatakan bahwa angka itu salah - untuk alasan apa pun - silakan coba dan kirim temuan Anda.
sumber
Coba gunakan jom daripada nmake
Dapatkan di sini: https://github.com/qt-labs/jom
Faktanya adalah bahwa nmake hanya menggunakan salah satu inti Anda, jom adalah klon dari nmake yang menggunakan prosesor multicore.
GNU make do the out-of-the-box berkat opsi -j, yang mungkin menjadi alasan kecepatannya vs Microsoft nmake.
jom bekerja dengan mengeksekusi paralel yang berbeda membuat perintah pada prosesor / core yang berbeda. Coba sendiri dan rasakan perbedaannya!
sumber
Saya ingin menambahkan hanya satu pengamatan menggunakan Gnu make dan alat-alat lain dari alat MinGW di Windows: Mereka tampaknya menyelesaikan nama host bahkan ketika alat-alat bahkan tidak dapat berkomunikasi melalui IP. Saya kira ini disebabkan oleh beberapa rutin inisialisasi dari runtime MinGW. Menjalankan proksi DNS lokal membantu saya meningkatkan kecepatan kompilasi dengan alat-alat ini.
Sebelum saya sakit kepala besar karena kecepatan build turun sekitar 10 atau lebih ketika saya membuka koneksi VPN secara paralel. Dalam hal ini semua pencarian DNS ini dilakukan melalui VPN.
Pengamatan ini mungkin juga berlaku untuk alat bangunan lain, tidak hanya berbasis MinGW dan itu bisa saja berubah pada versi MinGW terbaru.
sumber
Saya baru-baru ini dapat mengarsipkan cara lain untuk mempercepat kompilasi sekitar 10% di Windows menggunakan Gnu make dengan mengganti mingw bash.exe dengan versi dari win-bash
(Menang-bash tidak nyaman dengan pengeditan interaktif.)
sumber