İlk olarak, (IMO) Python ile karşılaştırmak neredeyse anlamsız. Yalnızca Objective-C ile karşılaştırma yapmak anlamlıdır.
- Yeni bir programlama dili nasıl bu kadar hızlı olabilir?
Amaç-C yavaş bir dildir. (Sadece C kısmı hızlıdır, fakat bunun nedeni C'dir) Hiç bu kadar hızlı olmamıştı. Onların (Apple'ın) amacı için yeterince hızlıydı ve eski sürümlerinden daha hızlıydı. Ve yavaştı çünkü ...
- Objective-C kötü bir derleyiciden mi kaynaklanıyor veya Objective-C'de Swift'den daha az etkili bir şey var mı?
Objective-C, dinamik olarak gönderilecek her yöntemin garantilidir. Hiçbir statik gönderim yok. Bu, bir Objective-C programını daha da optimize etmeyi imkansız hale getirdi. Eh, belki JIT teknolojisi biraz yardımcı olabilir, ancak Apple AFAIK, öngörülemeyen performans özelliklerinden ve nesne ömründen gerçekten nefret ediyor. JIT olayı kabul ettiklerini sanmıyorum. Objective-C uyumluluğu için bazı özel nitelikler koymadığınız sürece Swift, böyle dinamik gönderim garantisine sahip değildir.
- % 40'lık bir performans artışını nasıl açıklarsınız? Çöp toplama / otomatik referans kontrolünün bazı ek masraflar getirebileceğini biliyorum, ama bu kadar mı?
GC veya RC burada önemli değil. Swift ayrıca öncelikle RC kullanıyor. Orada hiçbir GC yoktur ve GC teknolojisinde devasa bir mimari sıçrama olmadıkça da olmayacaktır. (IMO, sonsuza kadar) Swift'in statik optimizasyon için daha fazla boşluğu olduğuna inanıyorum. Özellikle düşük seviyeli şifreleme algoritmaları, genellikle çok büyük sayısal hesaplamalara dayanırlar ve bu, statik olarak gönderilen diller için büyük bir kazançtır.
Aslında şaşırdım çünkü% 40 çok küçük görünüyor. Daha fazlasını beklerdim. Her neyse, bu ilk sürüm, ve optimizasyonun ana sorun olmadığını düşünüyorum. Swift bile özellik tamamlanmış değil! Daha iyi yapacaklar.
Güncelleme
Bazıları GC teknolojisinin üstün olduğunu savunmam için beni rahatsız ediyor. Aşağıdaki şeyler tartışılabilir olabilir ve sadece çok taraflı görüşüm olsa da, bu gereksiz argümandan kaçınmam gerektiğini söylemeliyim.
Muhafazakar / iz / nesiller / artan / paralel / gerçek zamanlı GC'lerin ne olduğunu ve nasıl farklı olduklarını biliyorum. Bence okuyucuların çoğu da zaten bunu biliyor. GC'nin bazı alanlarda çok iyi olduğunu ve bazı durumlarda yüksek verim gösterdiğini de kabul ediyorum.
Her neyse, GC işlem hacminin her zaman RC'den daha iyi olduğunu iddia ediyorum. RC genel giderinin çoğu ref-count sayı değişkenini korumak için ref-sayma işleminden ve kilitlemeden gelir. Ve RC uygulaması genellikle sayım işlemlerini önlemek için bir yol sağlar. Objective-C'de orada __unsafe_unretained
ve Swift'de (yine de bana göre hala belirsiz olsa da) bazı şeyler var unowned
. Eğer geri sayım işleminin maliyeti kabul edilemez ise, mekaniği kullanarak seçmeli olarak kapsam dışı bırakmayı deneyebilirsiniz. Teorik olarak, RC ek yükünü önlemek için tutmayan referansları çok agresif bir şekilde kullanarak neredeyse benzersiz mülkiyet senaryosunu taklit edebiliriz. Ayrıca, derleyicinin bazı gereksiz gereksiz işlemleri otomatik olarak ortadan kaldırabileceğini de umuyorum.
RC sisteminden farklı olarak, AFAIK, referans tiplerinin kısmi kapsam dışı bırakılması GC sisteminde bir seçenek değildir.
GC tabanlı sistemi kullanan birçok yayınlanmış grafik ve oyun olduğunu biliyorum ve aynı zamanda çoğunun determinizm eksikliği yüzünden acı çektiğini biliyorum. Sadece performans özelliği için değil, aynı zamanda ömür boyu yönetimi için de geçerlidir. Birlik çoğunlukla C ++ dilinde yazılmıştır, ancak küçük C # kısmı tüm garip performans sorunlarına neden olur. HTML hibrit uygulamaları ve hala herhangi bir sistemde öngörülemeyen ani acı çekiyor. Yaygın olarak kullanılması, bunun üstün olduğu anlamına gelmez. Bu, fazla seçeneği olmayan insanlar için kolay ve popüler olduğu anlamına gelir.
Güncelleme 2
Gereksiz tartışma veya tartışmayı önlemek için, biraz daha detay ekliyorum.
@Asik, GC sivri hakkında ilginç bir fikir verdi. Bu, her yerde değer türü yaklaşımını GC olaylarını reddetmenin bir yolu olarak görebiliriz. Bu oldukça çekici ve hatta bazı sistemlerde uygulanabilir (örneğin tamamen işlevsel bir yaklaşım). Bunun teoride güzel olduğu konusunda hemfikirim. Fakat pratikte bunun birkaç sorunu var. En büyük sorun, bu hilenin kısmi uygulanması, gerçek ani olmayan özellikler sağlamıyor.
Çünkü gecikme sorunu her zaman hep ya hiç sorunudur. 10 saniye boyunca bir kare çiviye sahipseniz (= 600 kare), o zaman tüm sistem açıkça başarısız olur. Bu ne kadar iyi ya da daha kötü değil. Sadece başarılı ya da başarısız. (veya% 0.0001'den az) Öyleyse GC spike'ın kaynağı nerede? GC yükünün kötü dağılımı. Ve bunun nedeni, GC'nin temelde belirsiz olmasıdır. Herhangi bir çöp yaparsanız, GC'yi aktive eder ve sonunda başak olur. Elbette, GC yükünün her zaman ideal olacağı ideal dünyada, bu olmayacak, ama hayali ideal dünyadan ziyade gerçek dünyada yaşıyorum.
O zaman sivri uçlardan kaçınmak istiyorsanız bütün ref-tiplerini tüm sistemden çıkarmalısınız . Ancak .NET çekirdek sistemi ve kütüphanesi gibi taşınamaz kısım nedeniyle zor, çılgınca ve hatta imkansız. Sadece GC olmayan sistemi kullanmak çok kolaydır .
GC'den farklı olarak, RC temelde belirleyicidir ve bu çılgınca optimizasyonu (sadece salt değer tipi) kullanmak zorunda kalmazsınız. Yapmanız gereken, sivri uçlara neden olan parçanın izini sürmek ve optimize etmek. RC sistemlerinde spike yerel algoritma sorunudur, ancak GC sistemlerinde spike her zaman global sistem sorunudur.
Sanırım cevabım konu dışı kaldı ve çoğunlukla mevcut tartışmaların tekrarı. Gerçekten bazı üstünlük / aşağılık / alternatif veya GC / RC maddeleriyle ilgili herhangi bir şey talep etmek istiyorsanız, bu sitede ve StackOverflow'ta birçok tartışma var ve orada savaşmaya devam edebilirsiniz.