Java veya Python ile karşılaştırıldığında C veya C ++ ile ilgili çeşitli hız değerleriyle ilgili çok fazla tartışma var gibi görünüyor, ancak nadiren Objective-C'den bahsedildiğini görüyorum. Kabaca dil performansı açısından nereye düşüyor?
Java veya Python ile karşılaştırıldığında C veya C ++ ile ilgili çeşitli hız değerleriyle ilgili çok fazla tartışma var gibi görünüyor, ancak nadiren Objective-C'den bahsedildiğini görüyorum. Kabaca dil performansı açısından nereye düşüyor?
Yanıtlar:
C ++ 'dan farklı olarak, Objective-C, C'nin temiz bir üst kümesi olarak tasarlanmıştır. Kullandığım birkaç Objective-C derleyicisi daha çok C derleyicileri olarak bilinir, ancak Objective-C'yi de kullanır.
Bu nedenle, kod oluşturma düzeyinde C ve Objective-C'nin eşdeğer olduğunu varsaymak güvenlidir.
İlk fark, "geç yöntem bağlanması" olarak da adlandırılan OOP ABI'de görülür. Tıpkı C ++ 'da olduğu gibi, Objective-C çalışma zamanında geçilen derleyici tarafından oluşturulan işlev işaretçi tablolarına dayanır.
Bununla birlikte, C ++ 'dan farklı olarak, bağlanma yöntemi daha' id
dinamik'tir ve üst sınıfın her yerde kullanımını teşvik ederek teoride C ++ 'dan biraz yavaşlar. Uygulamada, bu fark ölçülebilir seviyenin çok altındadır.
Son olarak, en önemli performans sorunu kullanılan kütüphanelerin kalitesidir. Objective-C sadece Apple sistemlerinde gerçekten popüler olduğundan, onu Cocoa ile kullandığınızı varsaymak mantıklıdır; yüksek seviyeli kütüphanelerden oluşan ince bir settir. Çoğu durumda, ağır kaldırmayı onlara bırakabilirsiniz, böylece kodunuzun çok hızlı olması gerekmez veya ağır bir crunching yaparsanız, büyük olasılıkla düz C'ye benzeyen çoğunlukla statik bir kod tabanı olacaktır. .
TL; DR: en önemli olan C ve C ++ dillerinde. İyi performans alamıyorsanız, algoritmalarınızı kontrol edin; her ciddi dilde olduğu gibi.
Objective-C, C / C ++ 'dan daha yavaştır. Yöntemleri gönderen Objective-C'nin çalışma zamanı olması, çalışma zamanında bu yürütme modelini aldığı Smalltalk ile aynı şekilde dinamik olarak arar. Çalışma zamanında tüm yöntemleri gönderir, işlev adresinin derleme zamanında (C ++ sanal yöntemleri hariç) belirlendiği C / C ++ işlev çağrısının aksine "gerçek ileti gönderme" olarak adlandırılır. Ama Objective-C'nin ne kadar yavaş olduğunu söyleyemem. ASAIK, performans cezası nedeniyle sadece uygulama geliştirme için kullanılır.
Kısa cevap: C / C ++ / D / Go / Rust ile benzer bir formatta derlenmiştir. Java / .Net gibi bir sanal ortam kullanmaz. Ve Python / Ruby / Lua / JavaScript gibi yorumlanmaz. Yani spektrumun daha hızlı ucunda.
Oliver'ın aşağıda söylediği gibi Obj-C ve C / C ++ arasındaki temel hız farkları dinamik yöntem gönderilmesinden kaynaklanmaktadır.
Bu makale Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946 adresindeki bu yükü göstermektedir.
Ayrıca yöntem gönderimini (yani objc_msgSend) sınırlayıcı faktör olarak belirlediğinizde Obj-C kodunuzu optimize etmek için çok güzel bir numara sağlar - işleve bir kez işaretçi alın ve işlevi birçok kez çağırmak için kullanın. Obj-C çalışma zamanları bu optimizasyonu otomatik olarak yaptığı için çok fazla yardımcı olmamalıdır .
Dinamik yöntem dağıtımının gerçek maliyetinin CPU şube tahminini kırdığı için önbellek hatalarından kaynaklandığını unutmayın. Bunların profilini çıkarmak zordur ve yukarıda belirtilen kodun gerçek önbellek kaçırma maliyetini ölçmemesi olabilir.
Biraz daha yararlı tartışma burada: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
Alt satır: diller arasındaki en büyük fark algoritmalarınızdır. Bunun ötesinde, dinamik veya sanal yöntem gönderimi nedeniyle Obj-C, C ve C ++ arasında temel bir hız farkı vardır. Bu ikinci nokta büyük görünmüyor. Ve makale yukarıda, onu optimize için bir numara verir eğer sen önbellek kayıpları nedeniyle zor olabilir profilleme yoluyla sıcak noktalar bulabilirsiniz.