Objective-C dil performans sürekliliğine nerede düşer?


20

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?


23
1986 - Brad Cox ve Tom Love, Objective-C'yi yaratarak "bu dil C'nin tüm bellek güvenliğini Smalltalk'ın tüm hızıyla birleştirdiğini" ilan etti. Modern tarihçiler bu ikisinin disleksik olduğundan şüpheleniyorlar. ( kaynak )
Mason Wheeler

4
Performansın önemli olmadığı aralığa girer. Kakao ile arayüz oluşturmak için desteklenen tek dildir, bu yüzden bunu yapmak istiyorsanız, başka hiçbir şey işe yaramaz. Başka bir şey için, performanstan bağımsız olarak korkunç bir seçim olduğunu düşünürdüm.
Jerry Coffin

1
"performans" bir dilin özelliği değil, bir dil uygulamasının ve daha da önemlisi o dilde yazılmış programların bir özelliğidir. Objective-C'de çok hızlı programlar yazabilir veya çok yavaş programlar yazabilirsiniz.
Caleb

İğrenç sözdizimine sahip olamıyor ancak mevcut derleyicilerine göre kötü performans gösteren bir dil değil, çünkü performans gerçek dilden daha çok derleyici / vm'ye dayanıyor.
Rig

Yanıtlar:


28

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' iddinamik'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.


4
Aslında, modern obj-c, modern C ++ kadar üstündür. C'de keyfi işaretçiler üzerinde aritmetik yapmanıza izin verilir, ObjC'de yapamazsınız. Ayrıca yöntem aramasından kaynaklanan performans farkı ölçülebilir: objc_msgSend'in hızlı yolu üye işlev çağrısından yaklaşık dört kat daha ağırdır (ve yavaş yollar hızlı yol kadar hızlı değildir).

11

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.


1
Bu performans karşılaştırmasını C ile buldum : rmarcus.info/?p=488 Görünen o ki Objective-C yine de C'ye oldukça yakın.
OlliP

İçinde paketi geri kalanı ile Objective C karşılaştırmak güzel olurdu kriterler Oyunu
Deer Hunter

Objective-C kodu Objecttive-C mesajı gönderir değil biraz uzatmak için olduğu gibi performans karşılaştırması bir parça tuz ile alınması gerektiğini düşünüyorum. Düşüşün ne için olduğunu bilmiyorum. On yıldan uzun bir süredir Smalltalk geliştirme yaptım ve Objective-C birçok yönden Smalltalk'a dayanıyor. Ben neden bahsettiğimi biliyorum.
OlliP

Downvoter değil; öncelikle yoğun sayısal algoritmalarla ilgileniyorum, dinamik dağıtım bunların içinde çok önemli değil .
Deer Hunter

8

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.


7

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.

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.