Sözdizimi ve anlambilim, bu sorunun diğer mükemmel cevapları tarafından zaten iyi tanımlanmıştır. Çünkü yürütme ve performans de ayrıntılı değildir, benim cevap ekleyecektir.
Bu 3 arasındaki fonksiyonel fark nedir?
Atomik'i her zaman oldukça meraklı bir varsayılan olarak düşünürdüm. Çalıştığımız soyutlama seviyesinde, bir sınıfın atomik özelliklerini araç olarak% 100 iplik güvenliği elde etmek için kullanmak bir köşe durumudur. Gerçekten doğru çok iş parçacıklı programlar için, programcının müdahalesi neredeyse kesinlikle bir gerekliliktir. Bu arada, performans özellikleri ve yürütme henüz ayrıntılı olarak açıklanmamıştır. Yıllar boyunca çok sayıda çok iş parçacıklı program yazdıktan sonra, mülklerimi sürekli olarak ilan nonatomic
ediyordum çünkü atomik hiçbir amaç için mantıklı değildi. Bu sorunun atomik ve atomik olmayan özelliklerinin ayrıntıları tartışılırken, bazı profilleme bazı ilginç sonuçlarla karşılaştım.
infaz
Tamam. Temizlemek istediğim ilk şey, kilitleme uygulamasının uygulama tanımlı ve soyutlanmış olmasıdır. Louis @synchronized(self)
örneğinde kullanıyor - bunu ortak bir karışıklık kaynağı olarak gördüm. Uygulama aslında kullanmaz @synchronized(self)
; nesne düzeyinde döndürme kilitleri kullanır . Louis'in illüstrasyonu, hepimizin aşina olduğu yapıları kullanan üst düzey bir illüstrasyon için iyidir, ancak kullanmadığını bilmek önemlidir @synchronized(self)
.
Başka bir fark, atomik özelliklerin alıcılarınızdaki nesnelerinizi koruyacağı / serbest bırakacağıdır.
Verim
İşte ilginç kısım: Tartışmasız (örneğin tek iş parçacıklı) durumlarda atomik özellik erişimini kullanan performans bazı durumlarda gerçekten çok hızlı olabilir. İdeal durumlardan daha az olan durumlarda, atomik erişimlerin kullanımı genel masrafın 20 katından daha pahalı olabilir nonatomic
. İken Tartışmalı 7 konuları kullanarak vaka üç bayt yapı (2.2 GHz için 44 kat daha yavaş oldu Core i7 Dört Çekirdekli, x86_64). Üç baytlık yapı, çok yavaş bir özelliğe örnektir.
İlginç yan not: Üç baytlık yapının kullanıcı tanımlı erişimcileri, sentezlenen atomik erişimcilere göre 52 kat daha hızlıydı; veya% 84 sentezlenmiş anatomik olmayan erişimcilerin hızı.
İtiraz edilen davalardaki nesneler de 50 katını aşabilir.
Uygulamalardaki optimizasyonların ve varyasyonların sayısı nedeniyle, bu bağlamlardaki gerçek dünyadaki etkileri ölçmek oldukça zordur. Sık sık "Güven ve profil oluşturup bir sorun olduğunu düşünmedikçe" gibi bir şey duyabilirsiniz. Soyutlama seviyesi nedeniyle, gerçek etkiyi ölçmek aslında oldukça zordur. Profillerden gerçek maliyetleri düşürmek çok zaman alabilir ve soyutlamalardan dolayı oldukça yanlış olabilir. Ayrıca, ARC ve MRC arasında büyük bir fark olabilir.
Peki gelelim adım geri, değil mülkiyet erişimlerin uygulanmasına odaklanan biz gibi olağan şüpheliler ekleriz objc_msgSend
ve birçok aramalar için bazı gerçek dünya üst düzey sonuçlarını incelemek NSString
de getter rakipsiz durumlarda (saniye cinsinden değerler):
- MRC | anatomik olmayan | elle uygulanan alıcılar: 2
- MRC | anatomik olmayan | sentezlenmiş alıcı: 7
- MRC | atomik | sentezlenmiş alıcı: 47
- ARC | anatomik olmayan | sentezlenmiş alıcı: 38 (not: ARC burada ref sayımı ekliyor)
- ARC | atomik | sentezlenmiş alıcı: 47
Muhtemelen tahmin ettiğiniz gibi, referans sayımı aktivitesi / döngüsü atomik ve ARC altında önemli bir katkıdır. Ayrıca, tartışmalı davalarda daha büyük farklılıklar görürsünüz.
Performansa çok dikkat etsem de, yine de Anlambilim Öncesi diyorum ! . Bu arada, performans birçok proje için düşük bir önceliktir. Ancak, kullandığınız teknolojilerin yürütme ayrıntılarını ve maliyetlerini bilmek kesinlikle zarar vermez. İhtiyaçlarınız, amaçlarınız ve yetenekleriniz için doğru teknolojiyi kullanmalısınız. Umarım bu size birkaç saatlik karşılaştırmaları kurtaracak ve programlarınızı tasarlarken daha bilinçli bir karar vermenize yardımcı olacaktır.