Neden bazı programlama dilleri diğerlerinden daha "daha hızlı" ya da "daha yavaş"?


81

Bir programlama dili üzerine kurulu bazı uygulamaların veya algoritmaların, aynı makinede çalışan Java / Node.js adlı dilden daha hızlı veya daha hızlı çalıştığını söylüyorlar. Bununla ilgili birkaç sorum var:

  1. Bu neden oluyor?
  2. Bir programlama dilinin "hızını" ne yönetir?
  3. Bunun bellek yönetimi ile bir ilgisi var mı?

Birisi bunu benim için kırdıysa gerçekten minnettar olurum.


18
Özellikle JVM ve CLR için, VM'leri optimize etmek için kapsamlı bir araştırma yapıldığına ve birçok durumda derlenmiş C ++ 'dan daha iyi performans gösterebileceklerine dikkat edin - ancak hatalı kıyaslama yapmak çok kolaydır.
chrylis -on grev-


26
Bununla birlikte, Java ile Javascript ile ilgili herhangi bir şeyi bir araya getirmek hakarettir.
Raphael

5
Bunu çok geniş bir şekilde kapatmak arasında bölünüyorum (ilgili konular hakkında ders kitapları yazılabilir!) Veya kopyalayın . Topluluk oyları lütfen!
Raphael

Yanıtlar:


96

Dil tasarımında ve uygulamasında programlamada, performansı etkileyebilecek çok sayıda seçenek vardır. Sadece birkaçından bahsedeceğim.

Her dilin sonunda makine kodunu çalıştırarak çalıştırılması gerekir. C ++ gibi bir "derlenmiş" dil derleme zamanında yalnızca bir kez çözümlenir, kodu çözülür ve makine koduna çevrilir. Doğrudan bir şekilde uygulanırsa "yorumlanmış" bir dil, çalışma zamanında, her adımda, her seferinde çözülür. Diğer bir deyişle, her bir açıklama yaptığımızda, muhabir bunun bir if-o zaman mı yoksa bir ödev vb. Olup olmadığını kontrol etmek ve buna göre davranmak zorundadır. Bu, eğer 100 kez döngü kurarsak, aynı kodu 100 kez deşifre ederek, zaman kaybettik demektir. Neyse ki, tercümanlar sıklıkla örneğin tam zamanında bir derleme sistemi aracılığıyla bunu optimize eder. (Daha doğrusu "derlenmiş" veya "yorumlanmış" bir dil diye bir şey yoktur - bu dilin değil uygulamanın bir özelliğidir.

Farklı derleyiciler / tercümanlar farklı optimizasyonlar yapar.

Dil otomatik bellek yönetimine sahipse, uygulamasının çöp toplama işlemi yapması gerekir. Bu çalışma zamanı maliyetine sahiptir, ancak programlayıcıyı hataya açık bir görevden kurtarır.

Uzman bir programcının her şeyi mikro-optimize etmesine ve CPU'dan daha fazla performans elde etmesine izin veren bir dil makineye daha yakın olabilir. Bununla birlikte, bunun uygulamada gerçekten faydalı olup olmadığı tartışılabilir, çünkü çoğu programcı gerçekten mikro-optimizasyon yapmaz ve çoğu zaman iyi bir üst seviye dil derleyici tarafından ortalama programcının yapabileceğinden daha iyi optimize edilebilir. (Bununla birlikte, bazen makineden uzak durmanın da faydaları olabilir! Örneğin, Haskell son derece yüksek, ancak tasarım seçenekleri sayesinde çok hafif yeşil ipliklere sahip olabiliyor.)

Statik tip kontrolü de optimizasyonda yardımcı olabilir. Dinamik olarak yazılmış, yorumlanmış bir dilde, her x - yhesaplanışta, tercüman genellikle her ikisinin x,yde sayı olup olmadığını kontrol etmeli ve (örneğin) başka bir istisna yaratmalıdır. Derleme zamanında türler önceden kontrol edilmişse bu kontrol atlanabilir.

Bazı diller çalışma zamanı hatalarını her zaman aklı başında bir şekilde bildirir. Eğer yazarsan a[100]nerede Java asadece 20 öğesi vardır, bir çalışma zamanı özel olsun. Bu, C'de tanımsız davranışa neden olur; bu, programın çökebileceği, bellekteki bazı rasgele verilerin üzerine yazabileceği veya kesinlikle başka bir şey yapabileceği anlamına gelir (ISO C standardı hiçbir sınırlama getirmez). Bu bir çalışma zamanı kontrolü gerektirir, ancak programcıya daha iyi bir anlam kazandırır.

Ancak, bir dili değerlendirirken performansın her şey olmadığını unutmayın. Bu konuda takıntılı olmayın. Her şeyi mikro-optimize etmeye çalışmak ortak bir tuzaktır, ancak verimsiz bir algoritma / veri yapısının kullanıldığını belirleyememiştir. Knuth bir keresinde "erken optimizasyon tüm kötülüklerin köküdür" dedi.

Bir programı doğru yazmanın ne kadar zor olduğunu küçümsemeyin . Genellikle, daha insan dostu bir semantik olan "daha yavaş" bir dil seçmek daha iyi olabilir. Ayrıca, bazı performans açısından kritik kısımlar varsa, bunlar her zaman başka bir dilde uygulanabilir. Referans olarak, 2016 ICFP programlama yarışmasında , kazananların kullandığı diller şunlardı:

1   700327  Unagi                       Java,C++,C#,PHP,Haskell
2   268752  天羽々斬                     C++, Ruby, Python, Haskell, Java, JavaScript
3   243456  Cult of the Bound Variable  C++, Standard ML, Python

Hiçbiri tek dil kullanmıyordu.


81
Knuth’un tüm teklifinin bir versiyonu : “Programcılar programlarının kritik olmayan bölümlerinin hızını düşünmek veya endişelenmek için çok fazla zaman harcıyorlar ve bu verimlilik denemeleri aslında hata ayıklama ve bakımda göz önüne alındığında güçlü bir olumsuz etkiye sahip. Küçük etkinlikleri unutmalıyız, zamanın yaklaşık% 97'sini söyleyelim: erken optimizasyon tüm kötülüklerin köküdür. Ancak bu kritik% 3'teki fırsatlarımızı kaçırmamalıyız. ”
Derek Elkins

6
Ayrıca bazı diller, derleyicinin optimizasyon yeteneğini etkileyebilecek görünüşte masum şeyleri garanti eder, C ++ ile FORTRAN
PlasmaHH

9
Yoruma @DerekElkins tarafından oy verilebilir. Çok sık olarak, bu teklifin içeriği eksik, hatta bazen tüm optimizasyonların kötü olduğunu savunan bir sonuca varıyor .
boru 12

9
@DerekElkins İronik olarak, belki de en önemli kısmı kaçırdınız: hemen aşağıdaki iki cümle. “İyi bir programcı böyle bir nedenden ötürü kayıtsız kalmayacak, eleştirel koda dikkatlice bakmak akıllıca olacaktır; ancak yalnızca bu kod tanımlandıktan sonra. Program gerçekten kritik, çünkü ölçme araçlarını kullanan programcıların evrensel deneyimleri sezgisel tahminlerinin başarısız olmasıydı. ” PDF p268
8bittree

9
@DerekElkins Açık olmak gerekirse, bunu söylerken ağzınıza kelimeler koymak istemiyorum, ama çok sık rastlanan insanlara baz alıntıya sadece biraz ekleyerek ve Knuth'un erken optimizasyon için savunuculuk yaptığını düşünüyorum. Tam makale, her zaman erken optimizasyona karşı durduğunu, neredeyse her zaman küçük optimizasyonlara karşı çıktığını, ancak kritik olarak ölçülen bölümlerdeki küçük optimizasyonların savunuculuğunu savunurken zamanın% 'sini oluşturur .
8bittree

19

Bir programlama dilinin "hızını" ne yönetir?

Bir programlama dilinin "hızı" diye bir şey yoktur. Belirli bir programda, belirli bir ortamda çalışan belirli bir yürütme motorunun belirli bir uygulamasının belirli bir sürümü tarafından yürütülen belirli bir program yazıcısının hızı vardır.

Farklı uygulamalar kullanarak aynı makinede aynı dilde yazılmış aynı kodu çalıştırırken büyük performans farklılıkları olabilir. Hatta aynı uygulamanın farklı versiyonlarını kullanmak. Örneğin, aynı ECMAScript benchmarkını 10 yıl önceki SpiderMonkey sürümünü kullanarak aynı makinede çalıştırmak, bu yılın bir versiyonuna göre muhtemelen 2 × - 5 ×, belki de 10 × arasında bir performans artışı sağlayacaktır. Bu ECMAScript'in ECMAScript'ten 2 kat daha hızlı olduğu anlamına mı geliyor, çünkü aynı programı aynı makinede çalıştırmak, yeni uygulamada 2 kat daha hızlı mı? Bu mantıklı değil.

Bunun bellek yönetimi ile bir ilgisi var mı?

Pek sayılmaz.

Bu neden oluyor?

Kaynaklar. Para. Microsoft, muhtemelen derleyici programcıları için kahve yapan tüm PHP, Ruby ve Python topluluğunun VM'lerde çalışan insanlardan daha fazla istihdam ediyor.

Performansı bir şekilde etkileyen bir programlama dilinin az ya da çok özelliği için de bir çözüm vardır. Örneğin, C (burada C'yi, bazıları C'den önce bile var olan benzer dillerin sınıfı için bir stand-in olarak kullanıyorum) bellek güvenli değildir, böylece aynı anda çalışan birden fazla C programı birbirimizin hafızası. Böylece, sanal bellek yarattık ve tüm C programlarının bir dolaylı katmandan geçmesini sağladık, böylece makinede çalışan tek kişi olduklarını iddia edebilirler. Ancak, bu yavaştır ve bu yüzden MMU'yu icat ediyoruz ve hızlandırmak için donanıma sanal bellek uyguluyoruz.

Fakat! Hafızaya dayanıklı diller hepsine ihtiyaç duymaz! Sanal belleğe sahip olmak onlara bir bit yardımcı olmuyor. Aslında daha da kötüsü: sadece sanal bellek değil, aynı zamanda donanıma güvenli dillere yardımcı olmakla kalmaz, hatta donanımda kullanıldığında bile sanal bellek de performansı etkiler. Çöp toplayıcılarının performansına özellikle zarar verebilir (bu, bellekte güvenli dillerin önemli bir kullanımıdır).

Başka bir örnek: modern ana akım genel amaçlı CPU'lar, önbellek kayıplarının sıklığını azaltmak için karmaşık hileler kullanır. Bu numaraların çoğu, hangi kodun yürütüleceğini ve gelecekte hangi belleğe ihtiyaç duyulacağını tahmin etmeye çalışmakla ilgilidir. Bununla birlikte, yüksek çalışma zamanı dereceli polimorfizmi olan diller için (örn. OO dilleri), bu erişim modellerini tahmin etmek gerçekten, gerçekten zordur.

Ancak, başka bir yol daha var: önbellek kaçırma toplam maliyeti, bireysel önbellek kaçırma maliyeti ile çarpılan önbellek kaçırma sayısıdır. Yaygın CPU'lar özlüyor sayılarını azaltmaya çalışırlar, ancak tek bir özledim maliyetini düşürebilirseniz ne olur?

Azul Vega-3 CPU, sanallaştırılmış JVM'leri çalıştırmak için özel olarak tasarlanmıştır ve çöp toplama ve kaçış tespitine (statik kaçış analizine dinamik eşdeğer) ve güçlü bellek kontrolörlerine ve tüm sisteme yardımcı olmak için bazı özel talimatlar içeren çok güçlü bir MMU'ya sahiptir. 20000'den fazla olağanüstü önbellek özeti uçuşta hala ilerleme kaydedebilir. Ne yazık ki, çoğu dile özgü CPU gibi, tasarımı basit bir şekilde kullanılmış ve "dev" Intel, AMD, IBM ve benzeri kullanıcılar tarafından kaba bir şekilde zorlanmıştır.

CPU mimarisi, bir dilin yüksek performanslı bir uygulamasına sahip olmanın ne kadar kolay ya da ne kadar zor olduğu üzerinde etkili olan bir örnektir. Modern mainstream CPU programlama modeli için uygun olan C, C ++, D, Rust gibi bir dil, Java, ECMAScript, Python, Ruby gibi CPU'yu "dövmek" ve CPU'yu atlatmak isteyen bir dilden daha hızlı yapmak için daha kolay olacaktır PHP.

Gerçekten, hepsi para meselesi. ECMAScript’te yüksek performanslı bir algoritma geliştirmek için eşit miktarda para harcıyorsanız, ECMAScript’in yüksek performanslı bir uygulaması olan ECMAScript’te tasarlanmış yüksek performanslı bir işletim sistemi olan ECMAScript için tasarlanmış yüksek performanslı bir CPU’dur. C benzeri dilleri hızlı yapmak için on yıllardır, o zaman muhtemelen eşit performans göreceksiniz. Sadece, şu anda, ECMAScript benzeri dilleri hızlı yapmaktan çok C-benzeri dilleri hızlı yapmak için çok daha fazla para harcandı ve C-benzeri dillerin varsayımları MMU'lardan ve CPU'lardan işletim sistemlerine kadar tüm yığına yapıldı. sanal bellek sistemleri kütüphanelere ve çerçevelere kadar.

Şahsen, en çok Ruby'ye aşinayım (genellikle "yavaş dil" olarak kabul edilir), bu yüzden iki örnek vereceğim: HashRubinius'taki sınıf (Ruby'deki merkezi veri yapılarından biri, anahtar-değer sözlüğü) Ruby uygulaması% 100 saf Ruby ile yazılmıştır ve yaklaşık olarak aynı performansa sahiptir.HashYARV sınıfında (en çok kullanılan uygulama), C dilinde yazılmıştır. Ayrıca YARV için C uzantısı olarak yazılmış bir görüntü işleme kitaplığı vardır; tonlarca dinamik ve yansıtıcı Ruby hilesi kullanan C'yi desteklemiyor; Oracle Labs'ın Truffle AST tercüman çerçevesi ve Graal JIT derleme çerçevesini kullanan deneysel bir JRuby şubesi, YARV'ın orijinal olarak optimize edilmiş C versiyonunu çalıştırabildiği kadar saf Ruby "geri çekilme versiyonunu" uygulayabilir. Bu basitçe (her şeyden başka bir şey değil) dinamik çalışma zamanı optimizasyonları, JIT derlemesi ve kısmi değerlendirme ile gerçekten akıllı şeyler yapan gerçekten zeki insanlar tarafından elde edilir.


4
Teknik olarak diller doğal olarak hızlı olmasa da, bazı diller programcının hızlı kod oluşturmasına izin vermeye daha fazla odaklanır. C öncelikli olarak diğer yollardan ziyade CPU'lara göre optimize edilmiştir. Örneğin C int, Python tarafından kullanılanlar gibi sınırsız tamsayıların matematiksel olarak daha doğal olmasına rağmen, performans nedenleriyle sabit ebatları seçti . Sınırlandırılmamış tamsayıların donanımda kullanılması, sabit boyutlu tamsayılar kadar hızlı olmaz. Uygulama detaylarını gizlemeye çalışan diller, saf C uygulamalarına yaklaşmak için karmaşık optimizasyonlara ihtiyaç duyar.
gmatht

1
C bir geçmişe sahiptir - assembly dilinde yazılmış bir sistemi diğer sistemlere taşınabilir hale getirmek için yaratılmıştır. Bu yüzden asıl amaç, Unix için bir "taşınabilir montajcı" sağlamaktı ve çok iyi tasarlanmıştı. 1980-1995 yılları arasında öyle başarılı oldu ki, Windows 95 geldiğinde kritik bir kitleye sahipti.
Thorbjørn Ravn Andersen

1
Kaynaklarla ilgili yorumlara katılmıyorum. Önemli olan takımdaki insan sayısı değil, takımdaki en iyi insanın yetenek seviyesi.
Michael Kay

"Microsoft, muhtemelen derleyici programcıları için tüm PHP, Ruby ve Python topluluğundan çok daha fazla insan çalıştırıyor, VM'lerinde çalışan insanlar var" Bu "derleyici programcısı" terimini ne kadar uzatmak istediğinize bağlı olduğunu düşünüyorum. Buna ne kadar kattığınızı (Microsoft bir sürü derleyici geliştirir ). Örneğin, sadece VS C ++ derleyici ekibi nispeten küçük AFAIK'dir.
Kübik

7

Teorik olarak, iki dilde aynı olan kodu yazıp her ikisini de "mükemmel" bir derleyici kullanarak derlerseniz, ikisinin de performansı aynı olmalıdır.

Uygulamada, performansın farklı olmasının birkaç nedeni vardır:

  1. Bazı dilleri optimize etmek daha zordur.

    Bu, özellikle kodu daha dinamik hale getiren özellikleri (dinamik yazma, sanal yöntemler, işlev işaretçileri) ve ayrıca örneğin çöp toplama özelliğini içerir.

    Bu özellikleri hızlı bir şekilde kullanarak kod yazmanın çeşitli yolları vardır, ancak genellikle bunları kullanmadan biraz daha yavaş sona erer.

  2. Bazı dil uygulamaları çalışma zamanında bazı derlemeler yapmak zorundadır.

    Bu, özellikle sanal makinelere sahip diller (Java gibi) ve kaynak kodunu çalıştıran diller için, ikili çalıştırma için ara adım olmadan (JavaScript gibi) uygulanır.

    Bu tür dil uygulamalarının çalışma zamanında daha fazla iş yapması gerekir; bu da performansı, özellikle de başlangıçtan hemen sonra başlangıç ​​zamanını / performansını etkiler.

  3. Dil uygulamaları kasıtlı olarak optimizasyonlar için olduğundan daha az zaman harcıyor.

    Tüm derleyiciler sadece üretilen kodun değil derleyicinin performansına da önem verir. Bu özellikle derleme için çok uzun süren uygulamanın çalışmasını yavaşlattığı çalışma zamanı derleyicileri (JIT derleyicileri) için önemlidir. Ancak, C ++ için de olduğu gibi, önceden derlenmiş derleyiciler için de geçerlidir. Örneğin, kayıt tahsisi NP-tamamlanmış bir sorundur, bu yüzden kusursuz bir şekilde çözülmesi gerçekçi değildir ve bunun yerine makul bir zamanda yürütülen sezgisel taramalar kullanılır.

  4. Deyimlerdeki farklı dillerde farklılıklar.

    Ortak kütüphaneleri kullanarak belli bir dilin (deyimsel kod) ortak stilinde yazılmış kod, performansta farklılıklara yol açabilir, çünkü bu deyimsel kod her dilde çok farklı davranır.

    Örnek olarak, vector[i]C ++ 'da, list[i]C #' da ve list.get(i)Java 'da düşünün . C ++ kodu muhtemelen aralık kontrolü yapmaz ve sanal arama yapmaz, C # kodu aralık kontrolü yapar, ancak sanal arama yapılmaz ve Java kodu aralık kontrolü yapar ve sanal bir aramadır. Her üç dil de sanal ve sanal olmayan yöntemleri destekler ve hem C ++ hem de C #, temel diziye erişirken aralık denetimini veya önleyebilir. Ancak, bu dillerin standart kütüphaneleri bu eşdeğer fonksiyonları farklı yazmaya karar verdi ve sonuç olarak performansları farklı olacak.

  5. Bazı derleyicilerde bazı optimizasyonlar eksik olabilir.

    Derleyici yazarları sınırlı kaynaklara sahiptir, bu nedenle diğer sorunları göz ardı ederek bile her olası optimizasyonu uygulayamazlar. Ve sahip oldukları kaynaklar, diğerlerinden daha fazla bir optimizasyon alanına odaklanmış olabilir. Sonuç olarak, farklı dillerde yazılmış kodlar, derleyicilerindeki farklılıklar nedeniyle farklı performanslara sahip olabilir, bir dilin diğerinden daha hızlı veya daha kolay hale getirilmesinin temel bir nedeni olmasa bile.


Bazı dil yok olması bir derleyici. Bazı diller için derleyici olamaz ( başvuru ).
Raphael

3
Bazı diller için statik bir derleyici olamaz . Dinamik derleme, statik özelliklerin kararsızlığından etkilenmez.
Jörg W Mittag

Dillerin yeterince farklı olması durumunda, "tamamen aynı olan bir kod" yoktur. Aynı çıktıyı üreten kod ya da aynı şey olmayan kullanıcı tarafından gözlemlenebilir davranışa sahip olabilirler. Bu yüzden senin öncülüne katılmıyorum.
einpoklum

@einpoklum Ayrımı göremiyorum. Burada ilginç olmadığını düşündüğüm bazı istisnalar (iş parçacığı senkronizasyonu gibi) nedeniyle, dil özellikleri genellikle gözlemlenebilir davranışları koruyan tüm optimizasyonlara izin verir. Kullanıcı tarafından gözlemlenemeyen, ancak optimize edilemeyen aklınızda ne tür davranışlar var?
svick

Teorik olarak, herhangi bir yorumlanan dil, bir tercüman + programın kaynak kodundan oluşan bir EXE dosyası oluşturarak “derlenebilir”.
dan04

1

Bu çok genel bir sorudur, ancak sizin durumunuzda cevap basit olabilir. C ++, Java'nın Java bayt kodunu derlediği makine koduna derlenir; bu durumda daha sonra Java sanal makinesini çalıştırır (yine de tam zamanında bir derleme olmasına rağmen, Java bayt kodunu yerel makine koduna ekler). Başka bir fark, yalnızca Java'nın sağladığı bir hizmet olan çöp toplama olabilir.


2
Bu çok basit bir cevap. Java'nın daha hızlı olduğu ayarlar var.
Raphael

4
Ayrıca, makine kodunu derleyen ve C ++ 'ın yorumlanan Java uygulamaları da vardır. Ve yine de "makine kodu" nedir, eğer doğal olarak JVM bayt kodunu çalıştıran bir picoJava CPU'sum varsa ve JVM üzerinde çalışan JPC x86 tercümanım varsa, o zaman x86 nesne kodunu "makine kodu" ve JVM bayt kodunu ne yapmaz?
Jörg W Mittag

2
Nitpick: Yalnızca Java çöp toplama değil ... ve yalnızca C ++ ve Java'yı düşünseniz bile, bazı C ++ çerçeveleri / kütüphaneleri programlarında çöp toplama tesisleri bulunur.
einpoklum

Yerel makine kodunu derlemek genellikle performansı artırır. Bununla birlikte, bazı sınırlı durumlarda yüksek kaliteli bir tercüman tam zamanında olmayan bir derleyiciyi yenebilir.
DepressedDaniel

@ JörgWMittag İşin püf noktası yerel makine kodunu (ana bilgisayar işlemcisinin anladığı makine kodu) derlemek ve daha sonra doğrudan yorumlanmış kod olmadan çalıştırılmak üzere çağrılan koda atlamaktır . Bu bir x86 yongasında x86 ve bir picoJava işlemcisinde JVM bytecodes olacaktır.
DepressedDaniel

-5

Sorunuz çok genel, bu yüzden korkarım ihtiyacınız olan cevabı veremiyorum.

En iyi açıklamam için, C ++ ve .Net platformuna bakalım.

C ++, performans nedeniyle makine koduna çok yakın ve eski zamanların en iyilerinden biri (10+ yıldan daha uzun bir süre önce mi?)? IDE ile bile C ++ programını geliştirmek ve yürütmek için gereken çok fazla kaynak yok, bunlar çok hafif ve çok hızlı sayılıyor. Ayrıca C ++ kodunu konsolda yazabilir ve oradan bir oyun geliştirebilirsiniz. Bellek ve kaynaklar açısından, bir bilgisayarın ne kadar kapasiteye sahip olduğunu kabaca unutmuştum, ancak kapasite, şu anki programlama dili ile kıyaslayamayacağınız bir şey.

Şimdi. NET'e bakalım. Net önkoşul, yalnızca bir tür programlama dilinden oluşmayan dev bir IDE'dir. Sadece geliştirici olarak C # diyelim bile, IDE'nin kendisi varsayılan olarak J #, VB, mobil vb. Gibi birçok programlama platformunu içerecektir. Özel yükleme yapmazsanız ve yalnızca IDE yüklemesiyle oynayabilecek kadar deneyiminiz olması koşuluyla tam olarak istediğiniz şeyi yükleyin.

IDE yazılımının kendisini kurmasından başka. Net ayrıca geliştiricilerin ihtiyaç duyduğu ve ihtiyaç duymadığı her türlü platforma kolay erişim amacıyla büyük kütüphaneler ve çerçeveler ile birlikte gelir.

Net'te geliştirme eğlenceli bir deneyim olabilir çünkü birçok ortak işlev ve bileşen varsayılan olarak kullanılabilir durumdadır. Sürükle ve bırak ve birçok doğrulama yöntemi, dosya okuma, veritabanı erişimi ve IDE'de çok daha fazlasını kullanabilirsiniz.

Sonuç olarak, bilgisayar kaynakları ve gelişme hızı arasında bir denge. Bu kütüphaneler ve çerçeve hafıza ve kaynakları alır. Net IDE'de bir program çalıştırdığınızda, kütüphanelerinizi, bileşenlerinizi ve tüm dosyalarınızı derlemeye çalışırken tonlarca zaman harcayabilir. Ve hata ayıklama yaptığınızda, bilgisayarınız IDE'nizdeki hata ayıklama işlemini yönetmek için birçok kaynak gerektirir.

Genellikle, .NET geliştirme yapmak için, bazı Ram ve işlemci ile iyi bir bilgisayara ihtiyacınız var. Aksi takdirde, hiç programlama yapmıyor olabilirsiniz. Bu açıdan, C ++ platformu .Net'ten çok daha iyidir. Yine de iyi bir bilgisayara ihtiyacınız olsa da, kapasite .Net ile karşılaştırıldığında çok fazla endişe yaratmayacak.

Cevabım sorunuza yardımcı olabilir umarım. Daha fazla bilgi edinmek istersen haberim olsun.

DÜZENLE:

Sadece ana noktaya bir açıklama olarak, temel olarak "Programlama hızını yöneten nedir" sorusuna cevap veriyorum.

IDE açısından, göreli IDE'de C ++ veya .Net dilinin kullanılması kodun yazılma hızını etkilemez, ancak Visual Studio derleyicisinin programı yürütmek için daha uzun zaman harcadığından geliştirme hızını etkiler, ancak C ++ IDE daha hafiftir ve daha az bilgisayar kaynağı tüketir. Böylece uzun vadede, C ++ tipi IDE ile daha hızlı programlama yapabilirsiniz, bu da kütüphanelere ve çerçeveye bağlı olarak .Net IDE ile karşılaştırmaktır. IDE'nin başlatılmasını, derlenmesini, programın çalıştırılmasını vb. Bekletme süresini alırsanız, programlama hızını etkiler. “Programlama hızı” aslında sadece “kod yazma hızı” na odaklanmıyorsa.

Ayrıca Visual Studio'daki kitaplık ve çerçeve sayısı bilgisayar kapasitesini de kullanır. Bu sorunun "bellek yönetimi" sorusuna cevap verip vermediğinden emin değilim, ancak Visual Studio IDE'nin çalıştırırken çok fazla kaynak kaplayabildiğini ve dolayısıyla genel "programlama hızını" yavaşlatacağını belirtmek istiyorum. Tabii ki, bunun "yazma hızı" ile ilgisi yok.

Tahmin edebileceğiniz gibi, C ++ 'ı çok fazla bilmiyorum, sadece örnek olarak kullanıyorum, asıl amacım bilgisayar kaynaklarını tüketen Visual Studio tipi ağır IDE ile ilgili.

Fikrim varsa ve konuya başlama sorusu sorusuna cevap vermediysem uzun yazı için özür dilerim. Ancak, konuyu daha açık hale getirip tam olarak "daha hızlı" ve "daha yavaş" hakkında bilmeleri gerekenleri sormasını sağlamak için iş parçacığı başlatıcısına tavsiye ederim


6
Sadece kayıt için, .NET geliştirme yalnızca .NET SDK'yı (ve yürütme için .NET çalışma zamanının kendisini) gerektirir. Düz bir metin editörü kullanabilir ve derleyiciyi komut satırından çağırabilirsiniz. IDE (Visual Studio'ya atıfta bulunduğunuzu varsayıyorum) gerekli DEĞİLDİR, ancak herhangi bir büyük projede (Intellisense, debugger, vb.) Kesinlikle yardımcı olur. SharpDevelop gibi daha az çan ve ıslık ile daha hafif IDE'ler de vardır.
MetalMikester

16
IDE'siz kesinlikle NET'te geliştirebilirsiniz. Fakat IDE'nin bir dilde yazılmış kodun hızıyla ne kadar ilişkili olduğunu anlamıyorum.
svick

8
@MetalMikester: Ve tabii ki, Visual Studio, Windows'ta C ++ geliştirme için IDE.
Jörg W Mittag

3
Ve C ++ 'ı .Net kodunu derlemek sadece tek bir derleyici anahtarıdır; farz edilen uçurum, görsel stüdyoda tek bir fare tıklamasıyla köprüler.
MSalters

1
Modern C ++ '' makine koduna çok yakın '' diyebileceğimden emin değilim. Orijinal C, evet; taşınabilir bir montajcı olarak tasarlandı ve buna çok yakın kaldı (standart kütüphane büyüdü ve çeşitli derleyiciler kökeninden daha uzak olan dile uygun dil eklentileri sunuyor). Orijinal C ++ (Sınıflı C), belki; sınıfları içeren bir C varyantının saf C'ye yeniden yazılması o kadar da zor değildir; bu noktada önceki tartışma geçerlidir. Fakat modern C ++, şablonlar, polimorfizm ve Güneş'in altındaki her şey? Bu neredeyse "makine koduna çok yakın" değil.
CVn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.