Swift derleme zamanı neden bu kadar yavaş?


210

Xcode 6 Beta 6 kullanıyorum.

Bu bir süredir beni rahatsız eden bir şey, ama şimdi neredeyse hiç kullanılamadığı bir noktaya ulaşıyor.

Projem iyi bir boyutta 65 Swift dosyası ve birkaç köprülü Objective-C dosyasına sahip olmaya başlıyor (bu gerçekten sorunun nedeni değildir).

Herhangi bir Swift dosyasında küçük bir değişiklik gibi görünüyor (uygulamada neredeyse hiç kullanılmayan bir sınıfa basit bir beyaz boşluk eklemek gibi), belirtilen hedef için tüm Swift dosyalarının yeniden derlenmesine neden olacaktır.

Daha derin bir araştırmadan sonra, derleyici süresinin neredeyse% 100'ünü alan şeyin, CompileSwiftXcode'un swiftchedefinizin tüm Swift dosyalarında komutu çalıştırdığı aşama olduğunu gördüm .

Daha fazla araştırma yaptım ve uygulama temsilcisini varsayılan bir denetleyiciyle tutarsam derleme çok hızlıdır, ancak proje dosyalarımı giderek daha fazla eklediğimde derleme zamanı gerçekten yavaşlamaya başlamıştı.

Şimdi sadece 65 kaynak dosyasıyla, her seferinde derlemek yaklaşık 8/10 saniye sürüyor. Çok hızlı değil .

Ben dışında bu konuda görüşmeye herhangi bir yayını görmedim bu bir , ama bu durumda bir tek ben merak ediyorum yüzden Xcode 6. eski bir sürümünü oldu.

GÜNCELLEME

GitHub'da Alamofire , Euler ve CryptoSwift gibi birkaç Swift projesini kontrol ettim , ancak hiçbirinin karşılaştırmak için yeterli Swift dosyası yoktu. İyi bir boyuta sahip olduğunu bulduğum tek proje SwiftHN idi ve sadece bir düzine kaynak dosyası olmasına rağmen, aynı şeyi, basit bir alanı ve tüm projeyi almaya başlayan yeniden derlemeye ihtiyaç duydum. az zaman (2/3 saniye).

Hem analizörün hem de derlemenin hızlı yanıp söndüğü Objective-C koduyla karşılaştırıldığında, bu gerçekten Swift'in büyük projeleri asla başaramayacağını düşünüyor, ama lütfen bana yanlış olduğumu söyle.

Xcode 6 Beta 7 ile GÜNCELLEME

Hâlâ hiçbir gelişme yok. Bu saçma olmaya başlıyor. #importSwift'in eksikliğinden dolayı , Apple'ın bunu nasıl optimize edebileceğini gerçekten göremiyorum.

Xcode 6.3 ve Swift 1.2 ile GÜNCELLEME

Apple, artımlı yapılar (ve diğer birçok derleyici optimizasyonu) ekledi . Bu avantajları görmek için kodunuzu Swift 1.2'ye taşımanız gerekir, ancak Apple bunu yapmanıza yardımcı olmak için Xcode 6.3'e bir araç ekledi:

Resim açıklamasını buraya girin

ANCAK

Benim gibi çok sevinmeyin. Derlemeyi artımlı yapmak için kullandıkları grafik çözücü henüz çok iyi optimize edilmemiştir.

Gerçekten de, işlev imzası değişikliklerine bakmaz, bu nedenle bir yöntemin bloğuna boşluk eklerseniz, bu sınıfa bağlı olan tüm dosyalar yeniden derlenir.

İkincisi, bir değişiklik onları etkilemese bile, yeniden derlenen dosyalara dayalı ağaç oluşturuyor gibi görünüyor. Örneğin, bu üç sınıfı farklı dosyalara taşırsanız

class FileA: NSObject {
    var foo:String?
}
class FileB: NSObject {
    var bar:FileA?
}
class FileC: NSObject {
    var baz:FileB?
}

Şimdi değiştirirseniz FileA, derleyici FileAyeniden derlenecek şekilde işaretler . Ayrıca yeniden derleme olacaktır FileB(buna değişikliklere göre Tamam olurdu FileA), ama aynı zamanda FileC, çünkü FileBrecompiled ve çünkü oldukça kötü FileCasla kullandığı FileAburada.

Umarım bu bağımlılık ağacı çözücüsünü geliştirirler ... Bu örnek kodla bir radar açtım .

Xcode 7 beta 5 ve Swift 2.0 ile GÜNCELLEME

Dün Apple beta 5'i yayınladı ve sürüm notlarının içinde görebiliyorduk:

Hızlı Dil ve Derleyici • Artımlı sürümler: bir işlevin yalnızca gövdesini değiştirmek artık bağımlı dosyaların yeniden oluşturulmasına neden olmamalıdır. (15352929)

Ben denedim ve şimdi gerçekten (gerçekten!) Çalıştığını söylemeliyim. Artımlı yapıları hızlı bir şekilde büyük ölçüde optimize ettiler.

swift2.0Şube oluşturmanızı ve XCode 7 beta 5'i kullanarak kodunuzu güncel tutmanızı şiddetle tavsiye ederim . Derleyicinin geliştirmelerinden memnun kalacaksınız (ancak XCode 7'nin küresel durumunun hala yavaş ve buggy olduğunu söyleyebilirim)

Xcode 8.2 ile GÜNCELLEME

Bu konudaki son güncellememden bu yana bir süre geçti, işte burada.

Bizim app şimdi iyi ama olağanüstü değil hemen hemen Swift kodu, yaklaşık 20k satır. Hızlı 2 ve hızlı 3 göçünden geçti. Temiz bir yapıda iyi olan 2014 ortası bir Macbook pro'da (2,5 GHz Intel Core i7) derlemek yaklaşık 5 / 6m sürer.

Bununla birlikte, Apple'ın aşağıdakileri iddia etmesine rağmen artımlı yapı hala bir şaka.

Xcode, yalnızca küçük değişiklikler olduğunda hedefin tamamını yeniden oluşturmaz. (28892475)

Açıkçası, çoğumuzun bu saçmalıklara baktıktan sonra güldüğümüzü düşünüyorum (projemin herhangi bir dosyasına bir özel (özel!) Mülk ekleyerek her şeyi yeniden derleyeceğiz ...)

Size konuyla ilgili biraz daha fazla bilgi içeren Apple geliştirici forumlarındaki bu konuya işaret etmek istiyorum (aynı zamanda arada bir Apple dev iletişimini takdir ediyorum)

Temelde insanlar artımlı yapıyı geliştirmeye çalışmak için birkaç şey bulmuşlardır:

  1. Olarak HEADER_MAP_USES_VFSayarlanmış bir proje ayarı ekletrue
  2. Find implicit dependenciesProgramınızdan devre dışı bırak
  3. Yeni bir proje oluşturun ve dosya hiyerarşinizi yenisine taşıyın.

Çözüm 3 deneyeceğim ama çözüm 1/2 bizim için işe yaramadı.

Tüm bu durumun ironik olanı, bu konudaki ilk gönderiye baktığımızda, Xcode 6 ile birlikte kullandığımız ilk Apple derlemelerine erimediğimizde ve şimdi yaklaşık iki yıl sonra hızlı bir şekilde 1 veya hızlı 1.1 koduna inanıyoruz. durum Xcode 6'daki kadar kötü. Ne kadar ironik.

Gerçekte içerdiği günlük hayal kırıklığı nedeniyle Projemiz için Swift'i Obj / C üzerinden seçmekten gerçekten pişmanım. (Hatta AppCode'a geçiyorum ama bu başka bir hikaye)

Her neyse, bu SO yazı 32k + görüş ve 143 ups bu yazı itibariyle vardır, bu yüzden sanırım tek değilim. Bu durumda kötümser olmasına rağmen orada durun, tünelin sonunda biraz ışık olabilir.

Zamanınız varsa (ve cesaretiniz varsa) Sanırım Apple bu konuda radarı karşılıyor.

Bir dahaki sefere kadar! Şerefe

Xcode 9 ile GÜNCELLEME

Takılmaları bu bugün. Xcode, mevcut korkunç performansı geliştirmek için sessizce yeni bir inşa sistemi başlattı. Çalışma alanı ayarlarından etkinleştirmeniz gerekir.

resim açıklamasını buraya girin

Henüz denediniz, ancak tamamlandıktan sonra bu yayını güncelleyeceksiniz. Yine de umut verici görünüyor.


1
İlginç! Sadece eksik bir optimizasyon mu yoksa arayüz dosyaları olmadığından çok fazla dosyayı ayrıştırma ihtiyacı mı diye merak ediyorum.
zaph

2
Benzer sorunlar vardı ve sonunda bunun JSON'dan serileştirmek için varlık sınıflarında kullanılan özel işleçlerden kaynaklandığını fark ettim. Herhangi birini kullanıyorsanız, normal işleve tek tek dönüştürmeyi denemenizi ve bir şeyin değişip değişmediğini görmenizi öneririm.
Antonio

4
Derleme, XCode 6 beta 6'dan bu yana projemde gıcırtılı bir şekilde yavaşladı. Nerede beta değişikliklerinden mi yoksa kodumdan mı kaynaklandığından emin değilim. Ama projem henüz büyük değil (~ 40-50 Swift dosyaları).
BadmintonCat

2
Derleme, projem büyüdükçe dayanılmaz derecede yavaşladı. Ben de birkaç kapsüller bağlıdır, ki eminim bu sorunu kızdırır. Bu, beta olmayan yeni sürümü kullanıyor.
Andy

2
Artımlı derleme hala "muhafazakar bağımlılık analizinde yapılır, bu nedenle yine de gerekenden daha fazla dosya yeniden oluşturulduğunu görebilirsiniz. Umarım, zamanla gelişir.
nmdias

Yanıtlar:


70

Rob Napier'in haklı olduğu ortaya çıktı. Derleyicinin berzek gitmesine neden olan tek bir dosya (aslında bir yöntem) idi.

Şimdi beni yanlış anlamayın. Swift, her seferinde tüm dosyalarınızı yeniden derler, ancak şimdi harika olan şey, Apple'ın derlediği dosyalar üzerine gerçek zamanlı derleme geri bildirimi eklemesidir, bu nedenle Xcode 6 GM şimdi hangi Swift dosyalarının derlendiğini ve gerçek zamanlı olarak derleme durumunu gösterir Bu ekran görüntüsünde görebileceğiniz gibi:

Resim açıklamasını buraya girin

Bu nedenle, hangi dosyalarınızın bu kadar uzun sürdüğünü bilmek çok kullanışlı geliyor. Benim durumumda bu kod parçası oldu:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
        "url" : self.url?.absoluteString ?? "",
        "title" : self.title ?? ""
        ])

return dic.copy() as NSDictionary

çünkü özellik titletürü var title:String?ve değil NSString. Derleyici onu eklerken deli oluyordu NSMutableDictionary.

Şu şekilde değiştiriliyor:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
        "url" : self.url?.absoluteString ?? "",
        "title" : NSString(string: self.title ?? "")
        ])

return dic.copy() as NSDictionary

derlemeyi 10/15 saniyeden (belki daha da fazla) bir saniyeye düşürdü ... inanılmaz.


3
Cevabı takip ettiğiniz için teşekkürler. Bu tür takip çıkarım motoru derleme sırasında aşağı bataklık diğerleri için çok yararlı olabilir.
Rob Napier

1
@Apouche bu manzaraya nereden ulaştınız? Ben xcode göremiyorum
Eric

2
Hata ayıklama yardımcısını (CMD + 8)
açmanız

1
Evet, Apple'ın bunu daha sonra optimize edeceğinden eminim, aksi takdirde gerçek dünya projelerini hızlı bir şekilde yapmak burada ve orada mahkumdur.
apouche

1
Hangi dosyaların derlendiğini gösteren bu araca nasıl ulaşabilirim?
jgvb

42

100k satır Swift kodu ve 300k satır ObjC kodu olduğu için bununla mücadele etmek için birkaç şey denedik.

İlk adımımız, tüm işlevleri derleme süreleri çıktısına göre optimize etmekti (örn. Https://thatthinginswift.com/debug-long-compile-times-swift/ )

Daha sonra, tüm hızlı dosyaları tek bir dosyada birleştirmek için bir komut dosyası yazdık, bu erişim seviyelerini kırdı, ancak derleme süremizi 5-6 dakikadan ~ 1 dakikaya getirdi.

Bu artık geçersiz çünkü Apple'a bunu sorduk ve aşağıdakileri yapmamız gerektiğini önerdiler:

  1. 'Swift Derleyici - Kod Üretimi' oluşturma ayarında 'tüm modül optimizasyonunu' açın. seçmek'Fast, Whole Module Optimization'

resim açıklamasını buraya girin

  1. 'Swift Derleyici - Özel Bayraklar'da, geliştirme sürümleriniz için '-Onone'

resim açıklamasını buraya girin resim açıklamasını buraya girin

Bu bayraklar ayarlandığında, derleyici tüm Swift dosyalarını tek adımda derler. Birleştirme komut dosyamızla, dosyaları tek tek derlemekten çok daha hızlı olduğunu gördük. Bununla birlikte, ' -Onone'geçersiz kılma olmadan, tüm modülü de optimize eder, bu da daha yavaştır. '-Onone'Bayrağı diğer Swift bayraklarında ayarladığımızda, optimizasyonu durdurur, ancak tüm Swift dosyalarını tek adımda derlemeyi durdurmaz.

Tüm modül optimizasyonu hakkında daha fazla bilgi için Apple'ın blog yayınına buradan göz atın - https://swift.org/blog/whole-module-optimizations/

Bu ayarların Swift kodumuzun 30 saniye içinde derlenmesine izin verdiğini gördük :-) Diğer projelerde nasıl çalışacağına dair hiçbir kanıtım yok, ancak Swift derleme sürelerinin sizin için hala bir sorun olup olmadığını denemenizi öneririz.

App store derlemeleriniz '-Onone'için, üretim derlemeleri için optimizasyon önerildiği için bayrağı dışarıda bırakmanız gerekir .


4
Bu tavsiye için çok teşekkürler! Resmi kaynaklarda (en azından bulmak kolay) neden böyle bir şey olmadığını anlamıyorum, örneğin bahsettiğiniz makalenin söz konusu olması gerekir (zorunlu!) -Onone. Şimdilik tüm modül optimizasyonunu kullanamıyoruz çünkü derleyici çökmesi yapıyor ... Ama tavsiyeleriniz yapım hızımıza neredeyse x10 artış sağlıyor. MacBook Air'de (yıllık 2013) yaklaşık 8 dakika inşa edildi, şimdi o zaman yaklaşık 1 dakika yarıya iniyor (hedefler (uygulama, uzantılar ve birkaç şirket içi çerçevemiz var) arasında geçiş yapmak ve hikaye tahtalarını derlemek
Ilya Puchka

Ben de bu yöntemi test ettim ve sadece -Onone içeren bahsedilen yöntemdir ve inşa süresini önemli ölçüde azaltır.
Vlad

Benim de çalış. -OnoneOluşturma sürelerini azaltmak için yardım kullanma . Çok teşekkürler dostum!
nahung89

34

Muhtemelen projenizin büyüklüğü ile ilgisi yoktur. Muhtemelen belirli bir kod parçası, muhtemelen sadece bir satır. Tüm proje yerine tek seferde bir dosya derlemeye çalışarak bunu test edebilirsiniz. Veya hangi dosyanın bu kadar uzun sürdüğünü görmek için derleme günlüklerini izlemeyi deneyin.

Soruna neden olabilecek kod türlerine örnek olarak, bu 38 satırlık özgeçmişin beta7'de derlenmesi bir dakikadan fazla sürer. Hepsine bu tek blok neden olur:

let pipeResult =
seq |> filter~~ { $0 % 2 == 0 }
  |> sorted~~ { $1 < $0 }
  |> map~~ { $0.description }
  |> joinedWithCommas

Bunu sadece bir veya iki çizgi ile basitleştirin ve neredeyse anında derleyin. Sorun, derleyicide üstel büyümeye (muhtemelen faktöriyel büyümeye) neden olan bir şeydir. Açıkçası bu ideal değildir ve bu tür durumları izole edebiliyorsanız, bu sorunların temizlenmesine yardımcı olmak için radar açmalısınız.


CompileSwiftAşama ile ilgili yorumumu gördüğünüzden emin değilim . Yalnızca bir tanesi değiştirilmiş olsa bile tüm hızlı dosyaları alır. Bu yüzden biraz zaman alan bir dosya (ki ben son derece şüpheliyim), derleyici asla hangisinin olduğunu söylemeyecektir.
apouche

10
Ne swiftckadar sürdüğünü görmek için dosyaları tek tek derleyebilirsiniz .
Rob Napier

Sana ödül vermediğin için özür dilerim çünkü ilk başta buna inanmıyorum. Ben de dosyaları tek tek derlemeye çalıştım ama yapmak için hantal oldu (düzgün çerçeveler vermek zorunda kaldı ve her zaman deps) bu yüzden vazgeçtim. Tam açıklama için lütfen bu
yazının

Proje boyutuna dayalı olduğunu düşünmüyorum. Projemde sadece 4 hızlı dosya var ve aniden inanılmaz derecede yavaş derlemeye başladı. Dün hızla aydınlanıyordu. Parmağımı, özellikle simge eklemek ve resim başlatmak dışında, projeme yaptığım hiçbir şeye koyamıyorum.
Travis

33

Derleme sürenizi yavaşlatan belirli dosyaları tanımlamaya çalışıyorsanız, xctool aracılığıyla komut satırınızdan derlemeyi dosyalara derleme zamanı vermeyi deneyebilirsiniz .

Dikkat edilmesi gereken şey, varsayılan olarak, her CPU çekirdeği için aynı anda 2 dosya oluşturması ve size "net" geçen süreyi değil, mutlak "kullanıcı" süresini vermesidir. Bu şekilde tüm zamanlamalar paralel dosyalar arasında bile çok benzer görünür.

Bunun üstesinden gelmek için -jobsbayrağı 1'e ayarlayın , böylece dosya derlemelerini paralelleştirmez. Daha uzun sürecek, ancak sonunda dosyayı dosyaya göre karşılaştırabileceğiniz "net" derleme sürelerine sahip olacaksınız.

Bu, hile yapması gereken örnek bir komuttur:

xctool -workspace <your_workspace> -scheme <your_scheme> -jobs 1 build

"Swift dosyalarını derle" aşamasının çıktısı şöyle olacaktır:

...Compile EntityObserver.swift (1623 ms)Compile Session.swift (1526 ms)Compile SearchComposer.swift (1556 ms)
...

Bu çıktıdan hangi dosyaların derlenmesinin diğerlerinden daha uzun sürdüğünü hızlı bir şekilde belirleyebilirsiniz. Ayrıca, yeniden düzenleme işlemlerinizin (açık dökümler, tür ipuçları vb.) Belirli dosyalar için derleme sürelerini düşürüp düşürmediğini yüksek doğrulukla belirleyebilirsiniz.

NOT: teknik olarak da yapabilirsiniz, xcodebuildancak çıktı inanılmaz derecede ayrıntılı ve tüketilmesi zordur.


1
Projenizin Tüm Modül Optimizasyonu'nu false olarak ayarladığınızdan emin olun, aksi takdirde her bir hızlı dosyayı ayırmaz.
Sabes

1
Bkz. Swift CompilerOptimization LeveliçinFast, Whole Module Optimization [-O -whole-module-optimization]
Matt

26

Benim durumumda, Xcode 7'nin hiçbir farkı yoktu. Derlemek için birkaç saniye gerektiren birden fazla işlevim vardı.

Misal

// Build time: 5238.3ms
return CGSize(width: size.width + (rightView?.bounds.width ?? 0) + (leftView?.bounds.width ?? 0) + 22, height: bounds.height)

Opsiyonelleri açtıktan sonra yapım süresi % 99.4 düştü .

// Build time: 32.4ms
var padding: CGFloat = 22
if let rightView = rightView {
    padding += rightView.bounds.width
}

if let leftView = leftView {
    padding += leftView.bounds.width
}
return CGSizeMake(size.width + padding, bounds.height)

Bu gönderide ve bu gönderide daha fazla örneğe bakın .

Xcode için Derleme Süresi Analiz Cihazı

Ben bir Xcode eklentisini geliştirdi hangi bu sorunları yaşıyor herkes için kullanışlı gelebilir.

görüntü

Swift 3'te iyileştirmeler geliyor gibi görünüyor, umarım Swift kodumuzun daha hızlı derlendiğini göreceğiz.


Harika, Umarım sana +1'den fazla verebilirim. doğru ve eklentiniz de harika. Bunu kullandım ve yapım sürem düşüyor, bu süper hızlı gelişme anlamına geliyor çünkü bu opsiyoneller bazen kabus ve derleyicinin yavaşlamasına neden oluyor.
hardikdevios

Fantastik ! Aletiniz bana çok yardımcı oluyor. Teşekkürler
Phil

Büyük eklenti - Gerçekten kullanışlı! Teşekkürler
365SplendidSuns

@Robert Gummesson, Objective-C Kodu için herhangi bir aracımız var mı?
Ashok

19

Muhtemelen Swift derleyicisini düzeltemiyoruz, ancak düzeltebileceğimiz bir şey kodumuz!

Kesin zaman aralıklarında dışarı baskılar derleyici her işlevi derlemek için gereken o Swift derleyicisi gizli seçenek yoktur: -Xfrontend -debug-time-function-bodies. Kodumuzdaki darboğazları bulmamıza ve derleme süresini önemli ölçüde geliştirmemize olanak tanır.

Basitçe terminalde aşağıdakileri çalıştırın ve sonuçları analiz edin:

xcodebuild -workspace App.xcworkspace -scheme App clean build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep [1-9].[0-9]ms | sort -nr > culprits.txt

Korku veren Brian Irace bu konuda parlak bir makale yazdı sizin Swift derleme sürelerini profil oluşturma .


2
Zsh alias grep='noglob grep'ilk olanlar için , othewise grep işe yaramaz
Jaime Agudo

16

Çözüm dökümdür.

Bunun gibi tonlarca sözlüklerim vardı:

["title" : "someTitle", "textFile" : "someTextFile"],
["title" : "someTitle", "textFile" : "someTextFile"],
["title" : "someTitle", "textFile" : "someTextFile"],
["title" : "someTitle", "textFile" : "someTextFile"],
.....

Derlenmesi yaklaşık 40 dakika sürdü. Bu gibi sözlükleri yayınlayana kadar:

["title" : "someTitle", "textFile" : "someTextFile"] as [String : String],
["title" : "someTitle", "textFile" : "someTextFile"] as [String : String],
["title" : "someTitle", "textFile" : "someTextFile"] as [String : String],
....

Bu, uygulamamda kodladığım veri türleriyle ilgili karşılaştığım hemen hemen her sorun için çalıştı.


6
evet, derleme sürelerini iyileştirmek için yaptığınız optimizasyonun bir parçası, ama yine de şu anki hızlı derleyici ile ilgili temel sorun, en ufak bir değişiklik yaptığınızda hala tek bir hızlı dosyayı yeniden derlemesidir.
apouche

4
Çok üzücü olmasaydı bu komik olurdu.
Tom Andersen

15

Dikkat edilmesi gereken bir nokta, Swift tipi çıkarım motorunun iç içe tiplerle çok yavaş olabileceğidir. Uzun süren tek tek derleme birimleri için derleme günlüğünü izleyip ardından Xcode'un doğduğu komutun tamamını kopyalayıp bir Terminal penceresine yapıştırarak CTRL- \ bazı teşhisler. Tam bir örnek için http://blog.impathic.com/post/99647568844/debugging-slow-swift-compile-times adresine göz atın .


Bu benim için en iyi cevap (bağlantıya bakın). KOLAY bir sorun olan iki farklı satırı bulabilir ve hatlarımı daha küçük satırlara ayırarak çözdüm.
Nico

Bu çok yararlı bir cevap çünkü derleyicinin nerede çıldığını nasıl bulacağını gösteriyor. Benim durumumda şunlar vardı: 'curScore [curPlayer% 2] + curScore [2 + curPlayer% 2] == 3 && maker% 2 == curPlayer% 2' 'if' 'den izin verir vermez 'ifadesi, "ifade makul bir zamanda çözülemeyecek kadar karmaşıktı; ifadeyi farklı alt ifadelere
Dmitry

Bu kesinlikle bu sorunu çözmenin en yararlı yoludur.
Richard Venable

9

Ayrıca hata ayıklama için derlerken (Swift veya Objective-C), Yalnızca Aktif Mimari Oluştur olarak ayarladığınızdan emin olun:

resim açıklamasını buraya girin


6

Tüm bunlar Beta sürümündedir ve Swift derleyicisi (en azından bugün itibariyle) açık olmadığından, sanırım sorunuzun gerçek bir cevabı yoktur.

Her şeyden önce, Objective-C ile Swift derleyicisini karşılaştırmak bir şekilde acımasız. Swift hala Beta'da ve Apple'ın yıldırım hızı sağlamanın ötesinde işlevsellik ve hataları düzeltmek için çalıştığından eminim (mobilyaları satın alarak bir ev inşa etmeye başlamıyorsunuz). Apple derleyiciyi zamanında optimize edecek.

Herhangi bir nedenden ötürü tüm kaynak dosyalarının eksiksiz olarak derlenmesi gerekiyorsa, ayrılmış modüller / kütüphaneler oluşturmak için bir seçenek olabilir. Ancak Swift, dil kararlı olana kadar kütüphanelere izin veremediğinden bu seçenek henüz mümkün değildir.

Benim tahminim derleyiciyi optimize edecekler. Önceden derlenmiş modüller oluşturamadığımız için aynı şekilde, derleyicinin her şeyi sıfırdan derlemesi gerekebilir. Ancak dil kararlı bir sürüme ulaştığında ve ikili biçim artık değişmediğinde, kütüphanelerimizi oluşturabiliriz ve belki (?) Derleyici de çalışmasını optimize edebilir.

Sadece tahmin etmek, sadece Apple bilir ...


"Önceden derlenmiş modüller oluşturamadığımız için aynı şekilde, derleyicinin her şeyi sıfırdan derlemesi gerekebilir." güzel gözlem, daha önce bu şekilde düşünmemiştim.
chakrit

1
2017 ve hala yavaş
Pedro Paulo Amorim

2017 Xcode 9 ve yeni inşa sistemi ile ve hala yavaş
pableiros

2018 Xcode 9 ile, 50'den fazla hızlı dosya içeren bir projem var, temiz bir derleme yaparsam, şimdi 5 dakika işaretini geçti ve derlemem henüz yapılmadı.
Chen Li Yong

5

Xcode 8 için proje ayarlarına gidin, ardından Düzenleyici> Derleme Ayarı Ekle> Kullanıcı Tanımlı Ayar Ekle'ye gidin ve aşağıdakileri ekleyin:

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Bu bayrağı eklemek, 40KLOC hızlı bir proje için mucizevi bir şekilde temiz derleme sürelerimizi 7 dakikadan 65'lere düşürdü. Ayrıca 2 arkadaş kurumsal projelerde benzer gelişmeler gördük doğrulayabilirsiniz.

Ben sadece bu Xcode 8.0 hata bir tür olduğunu varsayabiliriz

EDIT: Bazı insanlar için Xcode 8.3 artık çalışmıyor gibi görünüyor.


2
"Proje ayarları" nerede lütfen?
Raniys

@Raniys Xcode'da sol bölmedeki kök düzeyindeki mavi simgeye tıklayın.
Chris

Ben Xcode 8.3 (beta olmayan) olarak bu benim durumumda artık işe yaramaz buluyorum :(
Chris

4

Ne yazık ki, Swift derleyici hala hızlı ve artımlı derleme için optimize edilmemiştir (Xcode 6.3 beta'dan itibaren). Bu arada Swift derleme süresini iyileştirmek için aşağıdaki tekniklerden bazılarını kullanabilirsiniz:

  • Yeniden derleme etkisini azaltmak için uygulamayı Frameworks'e bölün. Ancak uygulamanızda döngüsel bağımlılıklardan kaçınmanız gerektiğini unutmayın. Bu konuyla ilgili daha fazla bilgi için bu yazıyı kontrol edin: http://bits.citrusbyte.com/improving-swift-compile-time/

  • Projenizin oldukça kararlı ve sık sık değişmeyen kısımları için Swift'i kullanın. Çok sık değiştirmeniz gereken diğer alanlar veya çok sayıda derleme / çalıştırma yinelemesinin tamamlanması gereken alanlar (neredeyse tüm kullanıcı arayüzüyle ilgili şeyler) için, Objective-C'yi bir mix-match yaklaşımı ile daha iyi kullanın.

  • 'Enjeksiyon için Xcode' ile çalışma zamanı kod enjeksiyonunu deneyin

  • Roopc yöntemini kullanın: http://roopc.net/posts/2014/speeding-up-swift-builds/

  • Açık dökümlerle bazı ipuçları vererek hızlı tip çıkarım motorunu rahatlatın.


4

Hızlı diziler ve sözlükler inşaatı bunun için oldukça popüler bir neden gibi görünüyor (özellikle Ruby arka planından gelenler için ), yani,

var a = ["a": "b",
         "c": "d",
         "e": "f",
         "g": "h",
         "i": "j",
         "k": "l",
         "m": "n",
         "o": "p",
         "q": "r",
         "s": "t",
         "u": "v",
         "x": "z"]

muhtemelen bunun düzeltilmesi gereken neden olacaktır:

var a = NSMutableDictionary()
a["a"] = "b"
a["c"] = "d"
... and so on

4

Hata ayıklama ve test için, derleme süresini yaklaşık 20 dakikadan 2 dakikadan daha kısa bir sürede kesmek için aşağıdaki ayarları kullandığınızdan emin olun,

  1. Proje oluşturma ayarlarında, "Optimizasyon" için Hata Ayıklama'yı "En Hızlı [-O3]" ya da üstüne çevirin.
  2. Aktif Mimari için Yapı Ayarla: VAR
  3. Hata ayıklama bilgi biçimi: DWARF
  4. Tüm Modül Optimizasyonu: HAYIR

Projenin sadece bu küçük bir değişikliği yapmak zorunda olduğumu ve test etmek için 30 dakika daha beklemek zorunda kaldığını fark etmek için sayısız saat harcadım. Bunlar benim için çalışan ayarlardır. (Hala ayarları deniyorum)

Ancak, en azından "DWARF with dSYM" ayarını yaptığınızdan (uygulamanızı izlemek istiyorsanız) ve Release / Archiving için iTunes Connect'e göndermek üzere Active Architecture'ı "NO" olarak ayarladığınızdan emin olun (burada birkaç saat harcadığımı da hatırlıyorum).


4
Yanılıyor olabilirim, ancak artan optimizasyon düzeylerini ayarlamak aslında oluşturma süresini artırmaz mı? Optimizasyon seviyeleri çalışma zamanı performansını artıracaktır.
Michael Waterfall

1
Set Build for Active Architecture: YESDerleme süresinde yaklaşık% 45 azalma sağladı. Çok teşekkürler.
Jean Le Moignan

4

Derleyici, türleri bulmak ve kontrol etmek için çok zaman harcıyor. Bu nedenle, tür ek açıklamaları eklemek derleyiciye çok yardımcı olur.

Çok sayıda zincirleme fonksiyon çağrınız varsa,

let sum = [1,2,3].map({String($0)}).flatMap({Float($0)}).reduce(0, combine: +)

Derleyicinin ne tür olması sumgerektiğini anlaması biraz zaman alır . Tür eklemek yardımcı olur. Ayrıca yardımcı olan aralıklı adımları ayrı değişkenlere çekmek.

let numbers: [Int] = [1,2,3]
let strings: [String] = sum.map({String($0)})
let floats: [Float] = strings.flatMap({Float($0)})
let sum: Float = floats.reduce(0, combine: +)

Özellikle sayısal türleri için CGFloat, Intbir çok yardımcı olabilir. Gibi bir değişmez sayı 2birçok farklı sayısal türü temsil edebilir. Bu yüzden derleyici, hangisinin bağlamdan çözülmelidir.

Benzer şekilde bakmak çok zaman alan işlevlerden +de kaçınılmalıdır. +Birkaç diziyi birleştirmek için birkaç kullanmak yavaştır çünkü derleyicinin +her biri için hangi uygulamanın çağrılması gerektiğini bulması gerekir+ . Bu yüzden mümkünse var a: [Foo]bununla birlikte a append()kullanın.

Tespit etmek için bir uyarı ekleyebilirsiniz hangi işlevlerin yavaş derleneceğini .

In Yapı Ayarlar için hedef arama için Diğer Swift Flags ve eklenti

-Xfrontend -warn-long-function-bodies=100

derlemek 100 ms'den uzun süren her işlev için uyarmak.


4

Objective-C ve Swift kodu karıştırın projelerde için, ayarlayabilirsiniz -enable-bridging-pchiçinde Other Swift Flags. Bununla, köprüleme üstbilgisi yalnızca bir kez ayrıştırılır ve sonuç (geçici bir “önceden derlenmiş üstbilgi” veya “PCH” dosyası) önbelleğe alınır ve hedefteki tüm Swift dosyalarında yeniden kullanılır. Apple, yapım süresini% 30 oranında azalttığını iddia etti. Referans Bağlantısı:

NOT: Bu yalnızca Swift 3.1 ve üstü için geçerlidir.


2

Mac'imi yeniden başlatmak bu sorun için harikalar yarattı. Sadece yeniden başlayarak 15 dakikalık yapılardan 30 saniyelik yapılara geçtim.


1

Yeni Xcode 6.3'te hızlı derleme süresi geliştirildi

Derleyici geliştirmeleri

Swift 1.2 derleyicisi daha kararlı olacak ve her şekilde performansı artıracak şekilde tasarlanmıştır. Bu değişiklikler ayrıca Xcode içinde Swift ile çalışırken daha iyi bir deneyim sağlar. En görünür iyileştirmelerden bazıları şunlardır:

Artımlı yapılar

Değişmeyen kaynak dosyalar artık varsayılan olarak yeniden derlenmeyecek ve bu da en sık karşılaşılan durumlar için derleme sürelerini önemli ölçüde artıracaktır. Kodunuzda yapılan daha büyük yapısal değişiklikler yine de birden çok dosyanın yeniden oluşturulmasını gerektirebilir.

Daha hızlı yürütülebilir dosyalar

Hata ayıklama yapıları, çok daha hızlı çalışan ikili dosyalar üretir ve yeni optimizasyonlar daha da iyi Sürüm oluşturma performansı sağlar.

Daha iyi derleyici teşhisi

Yeni Fix-it'lerle birlikte daha net hata ve uyarı mesajları, uygun Swift 1.2 kodunun yazılmasını kolaylaştırır.

Kararlılık iyileştirmeleri

En yaygın derleyici çökmeleri düzeltildi. Ayrıca Xcode düzenleyicide daha az SourceKit uyarısı görmelisiniz.


0

Burada, tür çıkarımlı büyük yavaşlamalara neden olabilecek başka bir durum var. Birleştirme operatörleri .

Şunun gibi satır değiştirme:

abs(some_optional_variable ?? 0)

için

abs((some_optional_variable ?? 0) as VARIABLE_TYPE)

Derleme süremi 70'lerden 13'lere getirmeye yardımcı oldu


0

Xcode 6.3.1'de hiçbir şey işe yaramadı - 100 Swift dosyası etrafına eklediğimde Xcode, derleme ve / veya dizine ekleme işlemine rastgele astı. Başarısız bir modüler seçeneği denedim.

Xcode 6.4 Beta'yı kurmak ve kullanmak aslında benim için çalıştı.


0

Bu benim için sihir gibi çalışıyor - Hızlı Derleme Hızlı Derleme . Derleme süresini 10 dakikadan 3 dakikaya düşürdü.

Bu açmak gerektiğini söyledi Whole Module Optimizationeklerken -OnoneiçindeOther Swift Flags .

/ Swift 3ÜzerindeXcode 8.3Xcode 8.2 kullanıyorum .


0

Karıştırma tamsayı değişmezi ve şamandıra bir ifadede sabitin da uzun derleme süresini neden olur.

1.0 + (1.0 + (1  * (1.0 + 1.0))) // 3429ms

1.0 + (1.0 + (1.0  * (1.0 + 1.0))) // 5ms

Birçok 1000 + ms derleme zamanı ifadesi, .0tamsayı bir tamsayı hazırlandıktan sonra 10 ~ 100 ms'ye düşürülür .

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.