Saya seorang pengembang C ++ dan C #. Saya telah mengembangkan aplikasi C # sejak beta pertama kerangka .NET dan saya memiliki lebih dari 20 tahun pengalaman dalam mengembangkan aplikasi C ++. Pertama, kode C # TIDAK AKAN PERNAH lebih cepat daripada aplikasi C ++, tetapi saya tidak akan membahas panjang lebar tentang kode yang dikelola, cara kerjanya, lapisan inter-op, internal manajemen memori, sistem tipe dinamis, dan pengumpul sampah. Namun demikian, izinkan saya melanjutkan dengan mengatakan bahwa tolok ukur yang tercantum di sini semuanya menghasilkan hasil yang TIDAK BENAR.
Izinkan saya menjelaskan: Hal pertama yang perlu kita pertimbangkan adalah compiler JIT untuk C # (.NET Framework 4). Sekarang JIT menghasilkan kode native untuk CPU menggunakan berbagai algoritme pengoptimalan (yang cenderung lebih agresif daripada pengoptimal C ++ default yang disertakan dengan Visual Studio) dan set instruksi yang digunakan oleh compiler .NET JIT adalah cerminan yang lebih dekat dari CPU yang sebenarnya. pada mesin sehingga substitusi tertentu dalam kode mesin dapat dilakukan untuk mengurangi siklus jam dan meningkatkan laju klik di cache pipeline CPU dan menghasilkan pengoptimalan hyper-threading lebih lanjut seperti pengurutan ulang instruksi dan peningkatan yang berkaitan dengan prediksi cabang.
Artinya, kecuali Anda mengompilasi aplikasi C ++ menggunakan parameter yang benar untuk build RELEASE (bukan build DEBUG), aplikasi C ++ Anda mungkin bekerja lebih lambat daripada aplikasi berbasis C # atau .NET yang sesuai. Saat menentukan properti proyek pada aplikasi C ++ Anda, pastikan Anda mengaktifkan "pengoptimalan penuh" dan "memilih kode cepat". Jika Anda memiliki mesin 64 bit, Anda HARUS menentukan untuk menghasilkan x64 sebagai platform target, jika tidak kode Anda akan dieksekusi melalui sub-lapisan konversi (WOW64) yang secara substansial akan mengurangi kinerja.
Setelah Anda melakukan pengoptimalan yang benar dalam kompiler, saya mendapatkan 0,72 detik untuk aplikasi C ++ dan 1,16 detik untuk aplikasi C # (keduanya dalam rilis build). Karena aplikasi C # sangat mendasar dan mengalokasikan memori yang digunakan dalam loop pada stack dan bukan pada heap, sebenarnya ia bekerja jauh lebih baik daripada aplikasi nyata yang terlibat dalam objek, komputasi berat, dan dengan kumpulan data yang lebih besar. Jadi angka yang diberikan adalah angka optimis yang bias terhadap C # dan kerangka .NET. Bahkan dengan bias ini, aplikasi C ++ selesai lebih dari separuh waktu dibandingkan aplikasi C # yang setara. Perlu diingat bahwa kompiler Microsoft C ++ yang saya gunakan tidak memiliki pengoptimalan pipeline dan hyperthreading yang benar (menggunakan WinDBG untuk melihat petunjuk perakitan).
Sekarang jika kita menggunakan kompiler Intel (yang merupakan rahasia industri untuk menghasilkan aplikasi berkinerja tinggi pada prosesor AMD / Intel), kode yang sama dijalankan dalam .54 detik untuk eksekusi C ++ vs .72 detik menggunakan Microsoft Visual Studio 2010 Jadi pada akhirnya, hasil akhirnya adalah 0,54 detik untuk C ++ dan 1,16 detik untuk C #. Jadi kode yang dihasilkan oleh compiler JIT .NET membutuhkan waktu 214% lebih lama daripada C ++ yang dapat dieksekusi. Sebagian besar waktu yang dihabiskan dalam .54 detik adalah untuk mendapatkan waktu dari sistem dan bukan dalam loop itu sendiri!
Hal yang juga hilang dalam statistik adalah waktu mulai dan pembersihan yang tidak termasuk dalam pengaturan waktu. Aplikasi C # cenderung menghabiskan lebih banyak waktu untuk start-up dan penghentian daripada aplikasi C ++. Alasan di balik ini rumit dan berkaitan dengan rutinitas validasi kode runtime .NET dan subsistem manajemen memori yang melakukan banyak pekerjaan di awal (dan akibatnya, akhir) program untuk mengoptimalkan alokasi memori dan sampah pengumpul.
Saat mengukur kinerja C ++ dan .NET IL, penting untuk melihat kode rakitan untuk memastikan bahwa SEMUA perhitungan ada. Apa yang saya temukan adalah bahwa tanpa meletakkan beberapa kode tambahan di C #, sebagian besar kode dalam contoh di atas sebenarnya telah dihapus dari biner. Ini juga terjadi pada C ++ ketika Anda menggunakan pengoptimal yang lebih agresif seperti yang disertakan dengan kompiler Intel C ++. Hasil yang saya berikan di atas 100% benar dan divalidasi di tingkat perakitan.
Masalah utama dengan banyaknya forum di internet yaitu banyak newbie yang mendengarkan propaganda marketing Microsoft tanpa memahami teknologinya dan membuat klaim palsu bahwa C # lebih cepat dari C ++. Klaimnya adalah bahwa secara teori, C # lebih cepat daripada C ++ karena kompiler JIT dapat mengoptimalkan kode untuk CPU. Masalah dengan teori ini adalah bahwa ada banyak pipa ledeng yang ada di kerangka .NET yang memperlambat kinerja; pipa ledeng yang tidak ada di aplikasi C ++. Selain itu, pengembang berpengalaman akan mengetahui kompiler yang tepat untuk digunakan pada platform tertentu dan menggunakan tanda yang sesuai saat menyusun aplikasi. Di Linux atau platform open source, ini tidak menjadi masalah karena Anda dapat mendistribusikan sumber Anda dan membuat skrip instalasi yang mengkompilasi kode menggunakan pengoptimalan yang sesuai. Di windows atau platform sumber tertutup, Anda harus mendistribusikan beberapa file yang dapat dieksekusi, masing-masing dengan pengoptimalan khusus. Biner windows yang akan disebarkan didasarkan pada CPU yang terdeteksi oleh penginstal msi (menggunakan tindakan kustom).