Ben bir C ++ ve C # geliştiricisiyim. .NET çerçevesinin ilk beta sürümünden beri C # uygulamaları geliştirdim ve C ++ uygulamaları geliştirmede 20 yıldan fazla deneyime sahibim. İlk olarak, C # kodu ASLA bir C ++ uygulamasından daha hızlı olmayacak, ancak yönetilen kod, nasıl çalıştığı, operasyonlar arası katman, bellek yönetimi dahili bileşenleri, dinamik tip sistemi ve çöp toplayıcı hakkında uzun bir tartışmaya girmeyeceğim. Yine de, burada listelenen kriterlerin hepsinin YANLIŞ sonuçlar verdiğini söyleyerek devam etmeme izin verin.
Açıklayayım: Dikkate almamız gereken ilk şey, C # için JIT derleyicisidir (.NET Framework 4). Şimdi JIT, çeşitli optimizasyon algoritmaları (Visual Studio ile birlikte gelen varsayılan C ++ optimize ediciden daha agresif olma eğilimindedir) kullanarak CPU için yerel kod üretir ve .NET JIT derleyicisi tarafından kullanılan komut seti, gerçek CPU'nun daha yakın bir yansımasıdır. makinede, böylece saat döngülerini azaltmak ve CPU boru hattı önbelleğindeki isabet oranını iyileştirmek ve talimatların yeniden sıralanması ve dal tahminiyle ilgili iyileştirmeler gibi daha fazla hiper iş parçacığı optimizasyonları üretmek için makine kodunda belirli ikameler yapılabilir.
Bunun anlamı, C ++ uygulamanızı RELEASE yapısı için doğru pararmetreleri (DEBUG yapısını değil) kullanarak derlemediğiniz sürece, C ++ uygulamanız, karşılık gelen C # veya .NET tabanlı uygulamadan daha yavaş çalışabilir. C ++ uygulamanızda proje özelliklerini belirtirken, "tam optimizasyon" u etkinleştirdiğinizden ve "hızlı kodu tercih ettiğinizden" emin olun. 64 bitlik bir makineniz varsa, hedef platform olarak x64 oluşturmayı BELİRTMENİZ GEREKİR, aksi takdirde kodunuz, performansı önemli ölçüde düşürecek bir dönüşüm alt katmanı (WOW64) aracılığıyla yürütülecektir.
Derleyicide doğru optimizasyonları gerçekleştirdikten sonra, C ++ uygulaması için .72 saniye ve C # uygulaması için 1.16 saniye (her ikisi de sürüm sürümünde) elde ediyorum. C # uygulaması çok basit olduğundan ve döngüde kullanılan belleği yığın üzerinde değil yığın üzerinde tahsis ettiğinden, aslında nesnelerde, ağır hesaplamalarda ve daha büyük veri kümelerinde yer alan gerçek bir uygulamadan çok daha iyi performans göstermektedir. Dolayısıyla sağlanan rakamlar, C # ve .NET çerçevesine yönelik iyimser rakamlardır. Bu önyargı ile bile, C ++ uygulaması eşdeğer C # uygulamasına göre yarıdan biraz daha fazla sürede tamamlanır. Kullandığım Microsoft C ++ derleyicisinin doğru ardışık düzen ve hiper iş parçacığı optimizasyonlarına sahip olmadığını unutmayın (montaj talimatlarını görüntülemek için WinDBG kullanarak).
Şimdi Intel derleyicisini kullanırsak (ki bu, AMD / Intel işlemcilerde yüksek performanslı uygulamalar oluşturmak için bir endüstri sırrıdır), aynı kod C ++ yürütülebilir dosya için .54 saniyede, Microsoft Visual Studio 2010 kullanılarak .72 saniyede yürütülür. Sonuç olarak, nihai sonuçlar C ++ için .54 saniye ve C # için 1.16 saniyedir. Dolayısıyla .NET JIT derleyicisi tarafından üretilen kod, C ++ yürütülebilir dosyadan% 214 kat daha uzun sürer. .54 saniyede harcanan zamanın çoğu, döngünün kendisinden değil, sistemden zamanı almakla ilgilidir!
İstatistiklerde eksik olan şey, zamanlamalara dahil edilmeyen başlatma ve temizleme süreleridir. C # uygulamaları, başlangıçta ve sonlandırmada C ++ uygulamalarından çok daha fazla zaman harcama eğilimindedir. Bunun arkasındaki neden karmaşıktır ve .NET çalışma zamanı kodu doğrulama rutinleri ve bellek ayırmalarını ve çöpü optimize etmek için programın başında (ve sonuç olarak sonunda) çok fazla iş yapan bellek yönetimi alt sistemi ile ilgilidir. kolektör.
C ++ ve .NET IL'nin performansını ölçerken, TÜM hesaplamaların orada olduğundan emin olmak için montaj koduna bakmak önemlidir. Bulduğum şey, C # 'a bazı ek kodlar koymadan, yukarıdaki örneklerdeki kodun çoğunun aslında ikiliden kaldırıldığıdır. Bu, Intel C ++ derleyicisiyle birlikte gelen gibi daha agresif bir iyileştirici kullandığınızda C ++ için de geçerliydi. Yukarıda verdiğim sonuçlar% 100 doğrudur ve montaj düzeyinde doğrulanmıştır.
İnternetteki birçok forumda temel sorun, birçok yeni kullanıcının teknolojiyi anlamadan Microsoft pazarlama propagandasını dinlemesi ve C # 'ın C ++' dan daha hızlı olduğu konusunda yanlış iddialarda bulunması. İddia, teoride, JIT derleyicisinin CPU için kodu optimize edebilmesi nedeniyle C # 'nın C ++' dan daha hızlı olmasıdır. Bu teoriyle ilgili sorun, .NET çerçevesinde performansı yavaşlatan çok sayıda sıhhi tesisat olmasıdır; C ++ uygulamasında bulunmayan sıhhi tesisat. Ayrıca, deneyimli bir geliştirici, verilen platform için doğru derleyiciyi bilecek ve uygulamayı derlerken uygun bayrakları kullanacaktır. Linux veya açık kaynaklı platformlarda, bu bir sorun değildir çünkü kaynağınızı dağıtabilir ve uygun optimizasyonu kullanarak kodu derleyen kurulum komut dosyaları oluşturabilirsiniz. Pencerelerde veya kapalı kaynak platformunda, her biri belirli optimizasyonlara sahip birden çok yürütülebilir dosya dağıtmanız gerekecektir. Dağıtılacak Windows ikili dosyaları, msi yükleyici tarafından algılanan CPU'ya dayanır (özel eylemler kullanılarak).