Bagaimana saya membuat Windows berjalan secepat Linux untuk mengkompilasi C ++?


142

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.


5
Saya tidak tahu mengapa, tetapi ini adalah perbedaan yang diketahui dalam karakteristik kinerja Windows dan Linux, Linux adalah WAY lebih baik daripada windows dalam berurusan dengan banyak file dalam satu direktori, mungkin itu hanya NTFS vs ext4 / apa pun? Bisa juga bahwa Windows setara dengan cache dentry Linux hanya tidak sebagus.
Spudd86

73
Mengapa ini ditutup? "Tidak bersikap konstruktif" ??! Saya merasa cukup relevan untuk pengembang.
Nils

3
Pertanyaan ini memang termasuk fakta dan dapat didukung oleh sejumlah fakta, referensi, apa pun. Hanya berpikir bahwa sebuah judul tampaknya kontroversial seharusnya tidak mencegah kita membahas masalah yang sudah lama tapi tidak cukup banyak dibicarakan. Sebagai pengguna Windows yang sudah lama, saya ingin mengajukan pertanyaan ini dan semoga mendapatkan jawaban yang produktif kapan saja. Buka kembali pertanyaan kecuali Anda dapat memberikan bukti aktual bahwa pertanyaan itu inheren argumentatif dan tidak didukung oleh fakta. Kalau tidak, Anda hanya menjadi moderatorobot.
Halil Özgür

2
@ HalilÖzgür: OK, komentar Anda mendorong saya untuk melihat sejarah revisi - judul pertanyaan awal itu meminta sesuatu seperti itu. Yang mungkin sangat baik menjadi alasan (saya tidak memilih untuk dekat), karena ada adalah posting oleh seseorang jelas tersinggung dengan judul asli dan mulai mengamuk, yang kemudian dihapus, mengarah ke penutupan ini pertanyaan ini. Judulnya telah diedit sejak itu, jadi saya pikir kami baik-baik saja. Dibuka kembali. Ingatlah bahwa Anda tetap harus mencoba untuk tidak membahas pertanyaan ... karena OP sedang mencari jawaban, memberikan jawaban, tidak ada yang lain.
BoltClock

2
Akan luar biasa melihat seseorang seperti @ raymond-chen berpadu dengan beberapa wawasan - jika pertanyaannya tetap teknis dan menawarkan data / fakta yang cukup jelas untuk mereproduksi masalah ini.
Benjamin Podszun

Jawaban:


32

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

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

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

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


Bisakah Anda menguraikan sedikit tentang # 2? Cukup mengejutkan - apakah itu karena kernel tidak men-cache data pada disk RAM atau sesuatu?
user541686

2
Jika Anda mengalokasikan sepotong memori sebagai ramdisk, itu tidak tersedia untuk kernel untuk caching atau digunakan untuk hal lain. Akibatnya, Anda meremas-remas tangannya dan memaksanya menggunakan lebih sedikit memori untuk algoritmanya sendiri. Pengetahuan saya bersifat empiris. Saya kehilangan kinerja ketika saya menggunakan RAMdisk untuk kompilasi.
Noufal Ibrahim

1
"Kecuali [seorang pakar tentang topik tertentu] hadir, Anda tidak akan mendapatkan lebih dari komentar partisan ... dan spekulasi": bagaimana bedanya dengan pertanyaan lain?
Dolph

1
Yang ini, berkat subjek Win vs Lin lebih merupakan magnet fanboy. Juga pertanyaannya agak bernuansa tidak seperti yang langsung yang hanya meminta perintah atau metode penggunaan.
Noufal Ibrahim

Tautan di # 1 tidak lagi aktif.
alkasm

28

Beberapa ide:

  1. Nonaktifkan 8.3 nama. Ini bisa menjadi faktor besar pada drive dengan sejumlah besar file dan jumlah folder yang relatif kecil:fsutil behavior set disable8dot3 1
  2. Gunakan lebih banyak folder. Dalam pengalaman saya, NTFS mulai melambat dengan lebih dari sekitar 1000 file per folder.
  3. Aktifkan build paralel dengan MSBuild; cukup tambahkan tombol "/ m", dan secara otomatis akan memulai satu salinan MSBuild per inti CPU.
  4. Letakkan file Anda di SSD - sangat membantu untuk I / O acak.
  5. Jika ukuran file rata-rata Anda jauh lebih besar dari 4KB, pertimbangkan untuk membangun kembali sistem file dengan ukuran cluster yang lebih besar yang secara kasar sesuai dengan ukuran file rata-rata Anda.
  6. Pastikan file telah didefragmentasi. File-file yang terfragmentasi menyebabkan banyak pencarian disk, yang dapat menyebabkan Anda membutuhkan 40+ throughput. Gunakan utilitas "contig" dari sysinternals, atau defragmenter Windows bawaan.
  7. Jika ukuran file rata-rata Anda kecil, dan partisi yang Anda gunakan relatif penuh, mungkin Anda menjalankannya dengan MFT yang terfragmentasi, yang buruk untuk kinerja. Juga, file yang lebih kecil dari 1K disimpan langsung di MFT. Utilitas "contig" yang disebutkan di atas dapat membantu, atau Anda mungkin perlu menambah ukuran MFT. Perintah berikut akan menggandakannya, menjadi 25% dari volume: fsutil behavior set mftzone 2Ubah angka terakhir menjadi 3 atau 4 untuk menambah ukuran dengan tambahan 12,5% tambahan. Setelah menjalankan perintah, reboot dan kemudian buat sistem file.
  8. Nonaktifkan waktu akses terakhir: fsutil behavior set disablelastaccess 1
  9. Nonaktifkan layanan pengindeksan
  10. Nonaktifkan perangkat lunak anti-virus dan anti-spyware Anda, atau setidaknya setel folder yang relevan untuk diabaikan.
  11. Letakkan file Anda pada drive fisik yang berbeda dari OS dan file paging. Menggunakan drive fisik terpisah memungkinkan Windows untuk menggunakan I / Os paralel pada kedua drive.
  12. Lihatlah bendera kompiler Anda. Kompiler Windows C ++ memiliki banyak pilihan; pastikan Anda hanya menggunakan yang benar-benar Anda butuhkan.
  13. Coba tambah jumlah memori yang digunakan OS untuk buffer paged-pool (pastikan Anda memiliki cukup RAM terlebih dahulu): fsutil behavior set memoryusage 2
  14. Periksa log kesalahan Windows untuk memastikan Anda tidak mengalami kesalahan disk sesekali.
  15. Lihat counter kinerja terkait Disk Fisik untuk melihat seberapa sibuk disk Anda. Panjang antrian tinggi atau waktu yang lama per transfer adalah pertanda buruk.
  16. 30% partisi disk pertama jauh lebih cepat daripada sisa disk dalam hal waktu transfer mentah. Partisi yang lebih sempit juga membantu meminimalkan waktu pencarian.
  17. Apakah Anda menggunakan RAID? Jika demikian, Anda mungkin perlu mengoptimalkan pilihan jenis RAID Anda (RAID-5 buruk untuk operasi tulis-berat seperti kompilasi)
  18. Nonaktifkan semua layanan yang tidak Anda butuhkan
  19. Folder defrag: menyalin semua file ke drive lain (hanya file), hapus file asli, salin semua folder ke drive lain (hanya folder kosong), lalu hapus folder asli, defrag drive asli, salin struktur folder kembali terlebih dahulu , lalu salin file. Ketika Windows membuat folder besar satu file pada satu waktu, folder tersebut akhirnya menjadi terfragmentasi dan lambat. ("contig" juga harus membantu di sini)
  20. Jika Anda terikat I / O dan memiliki siklus CPU yang tersisa, coba nyalakan kompresi disk. Ini dapat memberikan beberapa speedup yang signifikan untuk file yang sangat kompresibel (seperti kode sumber), dengan biaya CPU.

1
Bahkan jika Anda melakukan semua hal ini, Anda tidak akan mendekati kinerja Linux. Berikan tes di bawah ini coba dan posting waktu Anda jika Anda tidak setuju.
b7kich

6
Kami membutuhkan tolok ukur yang lebih baik. Mengukur waktu yang diperlukan untuk menghitung folder bukanlah hal yang sangat berguna, IMO. NTFS dioptimalkan untuk waktu pencarian file tunggal, dengan struktur btree. Di Linux (terakhir saya melihat), aplikasi dapat membaca seluruh folder dengan satu panggilan sistem, dan beralih melalui struktur yang dihasilkan seluruhnya dalam kode pengguna; Windows memerlukan panggilan sistem terpisah untuk setiap file. Either way, kompiler tidak perlu membaca seluruh folder ....
RickNZ

3
Lalu apa yang Anda gambarkan justru masalahnya. Memilih patokan yang berbeda tidak menyelesaikan masalah - Anda hanya memalingkan muka.
b7kich

2
Pertanyaannya adalah tentang mengoptimalkan waktu kompilasi. Waktu pencacahan folder tidak mendominasi waktu kompilasi pada Windows, bahkan dengan puluhan ribu file dalam folder.
RickNZ

1
Setelah membuat beberapa perubahan yang disarankan di atas, jalankan kedua "ls -R" untuk pohon kromium membutuhkan 4,3 detik untuk saya (vs 40 detik di OP). "dir / s" membutuhkan waktu sekitar satu detik. Beralih ke SSD tidak membantu untuk penghitungan saja, tapi saya kira itu akan membantu untuk kompilasi.
RickNZ

25

NTFS menghemat waktu akses file setiap saat. Anda dapat mencoba menonaktifkannya: "perilaku fsutil atur disablelastaccess 1" (mulai ulang)


6
Pengujian yang mencukur 4 detik turun dari 36 sebelumnya. Masih menjijikkan dibandingkan dengan .6 detik di VM linux saya
b7kich

21

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.


17

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.


serius? Maksudmu aku harus mencobanya untuk menggunakan VM sebagai dev maschine? Kedengarannya aneh ... VM apa yang Anda gunakan?
Martin Booka Weser

8
Saya menguji skenario di atas dengan Ubuntu 11,04 VM berjalan di dalam windows 7 workstation saya. 0,6 detik untuk VM linux, 36 detik untuk workstation windows saya
b7kich

2
Jika Anda menggunakan virtualbox dan menyiapkan drive bersama, Anda pada dasarnya dapat mempercepat kompilasi Anda secara gratis.
orlp

Kata-kata di sini sangat membingungkan, tapi saya berasumsi itu berarti VM yang di-host Windows yang menjalankan Linux, bukan VM yang menjalankan Windows yang di-host di Linux ... yang menarik, tetapi pembacaan pertama saya - literal - ini menyarankan bahwa menjalankan Windows di VM host di Linux untuk mengkompilasi menyebabkan kecepatan lebih cepat dari yang menjalankan Windows native - dan yang akan sudah benar-benar menjadi sesuatu.
underscore_d

@underscore_d, saya telah melihat sesuatu , di mana Windows dalam VM berjalan jauh lebih cepat daripada pada perangkat keras nyata. Mungkin karena Linux mengatakan kepada Windows bahwa itu beroperasi pada disk nyata, sementara Linux sebenarnya melakukan caching agresif di belakang layar. Menginstal Windows di mesin virtual juga berjalan sangat cepat, misalnya. Ini kembali pada hari-hari XP, tetapi saya akan terkejut jika ada banyak perbedaan hari ini.
Prof. Falken

17

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.

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

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

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

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


6
Mengatakan bahwa alasannya adalah "budaya, bukan teknis" tidak benar-benar menjawab pertanyaan. Jelas, ada satu atau lebih alasan teknis yang mendasari mengapa operasi tertentu lebih lambat pada Windows daripada di Linux. Sekarang, masalah budaya dapat menjelaskan mengapa orang membuat keputusan teknis yang mereka buat; tapi ini adalah situs tanya jawab teknis. Jawaban harus mencakup alasan teknis mengapa satu sistem lebih lambat dari yang lain (dan apa yang dapat dilakukan untuk memperbaiki situasi), bukan dugaan yang tidak dapat dibuktikan tentang budaya.
Brian Campbell

Ini sepertinya tidak memiliki banyak informasi teknis. Sebagian besar keadaan. Saya pikir satu-satunya cara kita akan mendapatkan info teknis nyata adalah dengan melihat perbedaan antara dua kompiler, membangun sistem, dll.
surfasb

Aplikasi Windows cenderung membuka satu file besar, tahan untuk waktu yang lama - Banyak aplikasi UNIX melakukan ini. Server, Emacs saya, dll.
Noufal Ibrahim,

Saya tidak berpikir emacs menyimpan file terbuka untuk waktu yang lama apakah itu besar atau kecil. Jelas tidak menulis di tengah file, memperbarui seperti database.
TomOnTime

... dan server juga tidak melakukannya. Fitur-fitur mereka pada sistem * nix biasanya dibagi dalam banyak modul kecil dengan inti server pada dasarnya adalah shell kosong.
spektrum

7

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 /slebih berkaitan dengan menulis output daripada mengukur file aktual kinerja traversal. Bahkan dir /s /b > nullambat di mesin saya dengan direktori besar.


6

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


5

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.exeproses untuk setiap baris resep yang menyebabkan perbedaan kinerja antara Windows dan Linux!

Menurut GNU membuat dokumentasi

.ONESHELL:

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!


4

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:

  • Windows Home Premium 7 (Ram 8GB) pada NTFS: 32 detik
  • Ubuntu 11.04 Linux (Ram 2GB) pada NTFS: 10 detik
  • Ubuntu 11.04 Linux (Ram 2GB) pada ext4: 0,6 detik

Untuk tes saya menarik sumber kromium (keduanya di bawah win / linux)

git clone http://github.com/chromium/chromium.git 
cd chromium
git checkout remotes/origin/trunk 

Untuk mengukur waktu saya berlari

ls -lR > ../list.txt ; time ls -lR > ../list.txt # bash
dir -Recurse > ../list.txt ; (measure-command { dir -Recurse > ../list.txt }).TotalSeconds  #Powershell

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.


1
Setelah melakukan beberapa penyetelan yang saya jelaskan dalam jawaban saya untuk Windows, menjalankan tes "ls-lR" di atas pada pohon chromium membutuhkan waktu 19,4 detik. Jika saya menggunakan "ls -UR" sebagai gantinya (yang tidak mendapatkan statistik file), waktu turun menjadi 4,3 detik. Memindahkan pohon ke SSD tidak mempercepat apa pun, karena data file di-cache oleh OS setelah dijalankan pertama kali.
RickNZ

Terima kasih telah berbagi! Meskipun peningkatan faktor 10 solid dibandingkan dengan skenario Windows 7 'out-of-the-box', itu masih merupakan faktor 10 lebih buruk daripada Linux / ext4.
b7kich

Saya pikir tujuan OP adalah untuk meningkatkan kinerja Windows, bukan? Juga, seperti yang saya posting di atas, "dir / s" berjalan sekitar satu detik.
RickNZ

3

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!


1

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.


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.