Swift süper yavaş yazma ve otomatik tamamlama özellikli Xcode 6


114

Sadece ben miyim yoksa Swift ile Xcode 6 (6.0.1) , kodunuzu yazdığınızda, özellikle otomatik tamamlamada süper yavaş görünüyor mu?

Normal bir Objective-C sınıfı, bir Swift projesinin içinde olsa bile, neredeyse öncekiyle aynı şekilde çalışır, bu yüzden onu öldüren Swift'dir.

Aynı rahatsızlığı yaşayan başka biri var mı? Performansı nasıl geliştireceğiniz konusunda herhangi bir fikriniz var mı?

  • Bazı ayarlarla oynamayı denedim ama şansım olmadı.
  • Ayrıca elbette Xcode'u ve bilgisayarı şanssız bir şekilde yeniden başlatmayı denedim.
  • Açık olan başka hiçbir ağır uygulama yok.

8GB RAM ve SSD HD ile 2009 Ortası Macbook Pro (2.26 GHz Intel Core 2 Duo) kullanıyorum ki bu hiç de en yeni şey değil ama yine de tam bir çöp değil.

Swift kullanmaya başlamaktan heyecan duyduğum için utanç verici ve şimdi gerçekten dayanılmaz.

Düşünceler / ipuçları?


1
Seninle aynı sorunları yaşıyorum. Çoğu zaman Xcode bana "SourceKit sonlandırıldı, düzenleyici geçici olarak sınırlandı" diyor
2014

Evet, bu da başka bir sorun, yine de ilişkili olduklarından emin değilim. Bu hata meydana geldiğinde bile yavaştı.
mllm

1
Eminim birbirleriyle ilişkilidir. Beta 5'te bu mesajı daha sık gördüm ve önerinin işe yaramadığı her zaman bunu gördüm. (Bazı karakterleri
yazıp

1
Bende de aynı sorun var. XCode'um CPU'nun% 300'ünden fazlasını kullanıyor ve macbook retinamı bir salyangoz hızına düşürüyor. Bu günlerde körü körüne yazıyorum ve xcode'un tamamlanmasını bekliyorum.
pkuhar

1
2011'in sonlarında, 8 GB RAM ve bir SSD'ye sahip 15,6 "MacBook Pro ile aynı sorunları yaşıyorum. Zaman kodu tamamlamanın% 90'ı Xcode'u donduruyor, etkinlik monitörünü kontrol ettiğimde ~% 200 CPU kullanımı görüyorum. Birkaç saniyeden sonra donuyor bir kaç dakikaya kadar.
isair

Yanıtlar:


86
  • Xcode'dan çıkın ve Mac'i yeniden başlatın gerekli değildir, ancak tercih edilir.
  • ~ / Library / Developer / Xcode / DerivedData klasörünün içeriğini silin
  • İçeriği silin ~ / Library / Caches / com.apple.dt.Xcode

Bu geçici bir çözümdür, ancak büyük ölçüde işe yarar.

Script Editor uygulamasını kullanarak komut dosyasının altında.

tell application "Terminal"
    do script "rm -frd ~/Library/Developer/Xcode/DerivedData/*"
    do script "rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
end tell

Alternatif olarak, terminaliniz için aşağıdaki gibi bir takma ad oluşturabilirsiniz:

alias xcodeclean="rm -frd ~/Library/Developer/Xcode/DerivedData/* && rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"

Bunu kendinize ekleyebilir ~/.bash_profileve ardından xcodecleanbu iki klasörü temizlemek istediğiniz her seferinde komut satırına yazabilirsiniz .


Pekala, mükemmel olmaya yakın olmasa da, çözümünüz onu önemli ölçüde iyileştiriyor gibi görünüyor. Çözmek için işaretleyeceğim, çünkü oldukça uzun bir süre sonra elde edebileceğinin en iyisi bu olacak. Başkalarını duymaktan mutluluk duyarım ... Çok teşekkürler!
mllm

Bu iki klasördeki tüm içeriği kaldırmak dizüstü bilgisayarımın neredeyse bir dakikasını aldı. Xcode üzerinde indeksleme artık 30 saniyenin altında.
Eneko Alonso

Yazmamı ve otomatik tamamlamamı daha hızlı yapmadı, ancak Mac'imden oldukça fazla alan boşaltmama yardımcı oldu.
Scott Zhu

Bu yanıt, otomatik tamamlama olayına yardımcı oldu, stackoverflow.com/a/29849869/1213267
Scott Zhu

13

Bazı "basit" kodlar yazarken de% 100 + CPU deneyimi yaşadım. Kodunuzu yapılandırma şeklinizle hızlı ayrıştırıcıyı daha hızlı hale getirmek için bazı küçük püf noktaları.

Dizelerde "+" birleştirici kullanmayın. Benim için bu, yavaşlığı çok hızlı tetikliyor. Her yeni "+" ayrıştırıcıyı bir taramaya götürür ve işlev gövdenizde herhangi bir yere yeni bir karakter eklediğiniz her seferinde kodu yeniden ayrıştırması gerekir.

Onun yerine:

var str = "This" + String(myArray.count) + " is " + String(someVar)

Hızlı bir şekilde ayrıştırmak için çok daha verimli görünen şablon sözdizimini kullanın:

var str = "This \(myArray.count) is \(someVar)"

Bu şekilde temelde satır içi değişkenler "\ (*)" ile strlen'de bir sınır olmadığını görüyorum.

+ / * Kullanan hesaplamalarınız varsa, bunları daha küçük parçalara bölün.

Onun yerine:

var result = pi * 2 * radius 

kullanın:

var result  = pi * 2
    result *= radius

Daha az verimli görünebilir, ancak hızlı ayrıştırıcı bu şekilde çok daha hızlıdır. Bazı formüller, matematiksel olarak doğru olsalar bile, çok sayıda işlem yapmak zorunda kalırlarsa derlenmezler.

Bazı karmaşık hesaplamalarınız varsa, onu bir func'a koyun. Bu şekilde, ayrıştırıcı bunu bir kez ayrıştırabilir ve işlev bedeninizde bir şeyi her değiştirdiğinizde yeniden ayrıştırmak zorunda kalmaz.

Çünkü işlev gövdenizde bir hesaplama varsa, o zaman bir şekilde hızlı ayrıştırıcı türlerin, sözdiziminin vb. Hala doğru olup olmadığını her seferinde kontrol eder. Hesaplamanın üzerinde bir çizgi değişirse, hesaplamanızın / formülünüzün içindeki bazı değişkenler değişmiş olabilir. Harici bir işleve koyarsanız, bir kez doğrulanır ve hızlı bir şekilde doğru olacağından ve sürekli olarak yeniden ayrıştırmadığından mutlu olur, bu da yüksek CPU kullanımına neden olur.

Bu şekilde her tuşa basıldığında% 100'den yazarken düşük CPU'ya ulaştım. Örneğin, işlev bedeninize satır içi olarak yerleştirilen bu 3 satır, hızlı ayrıştırıcıyı bir taramaya getirebilir.

let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData  = NSDictionary(contentsOfFile: fullPath )! // as Dictionary<String, AnyObject>
let spaces : AnyObject   = spacesData["SpacesDisplayConfiguration"]!["Management Data"]!!["Monitors"]!![0]["Spaces"]!! 

println ( spaces )

ancak bir işlev koyup sonra ararsam, hızlı ayrıştırıcı çok daha hızlı

// some crazy typecasting here to silence the parser
// Autodetect of Type from Plist is very rudimentary, 
// so you have to teach swift your types
// i hope this will get improved in swift in future
// would be much easier if one had a xpath filter with
// spacesData.getxpath( "SpacesDisplayConfiguration/Management Data/Monitors/0/Spaces" ) as Array<*> 
// and xcode could detect type from the plist automatically
// maybe somebody can show me a more efficient way to do it
// again to make it nice for the swift parser, many vars and small statements
func getSpacesDataFromPlist() -> Array<Dictionary<String, AnyObject>> {
  let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"

  let spacesData  = NSDictionary(contentsOfFile: fullPath )!    as Dictionary<String, AnyObject>
  let sdconfig    = spacesData["SpacesDisplayConfiguration"]    as Dictionary<String, AnyObject>
  let mandata     = sdconfig["Management Data"]                 as Dictionary<String, AnyObject> 
  let monitors    = mandata["Monitors"]                         as Array<Dictionary<String, AnyObject>> 
  let monitor     = monitors[0]                                 as Dictionary<String, AnyObject>
  let spaces      = monitor["Spaces"]                           as Array<Dictionary<String, AnyObject>>

  return spaces
}

func awakeFromNib() {
  ....
  ... typing here ...

  let spaces = self.getSpacesDataFromPlist()
  println( spaces) 
}

Swift ve XCode 6.1 hala çok hatalı, ancak bu basit hileleri takip ederseniz, kod düzenleme tekrar kabul edilebilir hale gelir. .H dosyalarından kurtulduğu ve çok daha temiz sözdizimi kullandığı için swift'i çok tercih ederim. "MyVar as AnyObject" gibi hala çok sayıda tip döküm gerekli, ancak karmaşık amaç-c proje yapısı ve sözdizimi ile karşılaştırıldığında bu daha küçük bir kötülük.

Ayrıca başka bir deneyim, kullanımı eğlenceli olan SpriteKit'i denedim, ancak 60 fps'de sabit bir yeniden boyamaya ihtiyacınız yoksa oldukça verimsiz. Sprite'larınız o kadar sık ​​değişmiyorsa, eski CALayer'ları kullanmak CPU için çok daha iyidir. Katmanların .content'lerini değiştirmezseniz, CPU temelde boşta kalır, ancak arka planda çalışan bir SpriteKit uygulamanız varsa, diğer uygulamalardaki video oynatma, 60 fps'lik sınırlı güncelleme döngüsü nedeniyle takılmaya başlayabilir.

Bazen xcode derleme sırasında tuhaf hatalar gösterir, sonra "Ürün> Temizle" menüsüne gidip onu tekrar derlemek yardımcı olur, önbelleğin hatalı bir uygulaması gibi görünür.

Xcode kodunuzla sıkıştığında ayrıştırmayı iyileştirmenin bir başka harika yolu da buradaki başka bir yığın aşımı gönderisinde belirtilmiştir . Temel olarak, .swift dosyanızdaki tüm içeriği harici bir düzenleyiciye kopyalarsınız ve ardından işlevlerine göre işlev görürsünüz, onu geri kopyalayın ve darboğazınızın nerede olduğunu görün. Bu, projem% 100 CPU ile çıldırdıktan sonra, xcode'u tekrar makul bir hıza getirmeme yardımcı oldu. kodunuzu geri kopyalarken, onu yeniden düzenleyebilir ve işlev bedenlerinizi kısa ve işlevler / formüller / ifadeler basit (veya birkaç satıra bölünmüş) tutmaya çalışabilirsiniz.


Çok kapsamlı cevap. Belki önerilerden bazıları "ilk yardım" olarak harika olabilir, ama gerçekten, Xcode'un büyük bir güçlük çekmeden basitçe çalışmasını beklemiyor muyuz?
mllm

1
ne yazık ki xcode 6.1 + swift oldukça kararsızdır, bu yüzden bu “hack'lere” ihtiyaç vardır. Apple, swift ve xcode'u düzeltmelidir. Ancak swift ile programlamak çok güzel, bu nedenle kısa vadede CPU Kullanımını uzak tutmanın tek yolu budur.
Daniel Unterberger

Önerdiğiniz tüm olası değişiklikleri yaptım ama maalesef otomatik tamamlamam hala berbat. cümleciklerin de sorun yaratabileceğinden şüpheliyim. Bunu kimse kabul edebilir mi? Yani dönüş (a == b)? x: y
Ilker Baltacı


10

Otomatik tamamlama, Xcode 4'ten beri bozuktur. Apple, bu 2 yıllık hatayı düzeltmeye karar verene kadar, maalesef tek çözüm, XCode'un tercihlerinde kod tamamlamayı KAPATMAKtır (aşağıdaki resimdeki ilk seçenek).

Yazarak CTRL spaceveya ESCihtiyacınız olduğunda manuel olarak tamamlamanın keyfini çıkarmaya devam edebilirsiniz .

Vakaların% 100'ü için her seferinde işe yarayan tek çözüm budur.

görüntü açıklamasını buraya girin

Son zamanlarda keşfettiğim bir diğer şey ise: Xcode üzerinde eklenti kullanıyorsanız, kullanmayın. Hepsini kaldırın. Sorunu daha da kötüleştiriyorlar.


5

Spotify kullanıyor musun? Yosemite GM'yi 2009 ortalarında (2.66Ghz) aynı sorunu olan bir iMac'e Xcode 6.1 GM ile kurdum. "SpotifyWebHelper" adlı bir işlemin her zaman yanıt vermiyor olarak kırmızı işaretlendiğini buldum, bu yüzden "web'den başlat" seçeneğini devre dışı bıraktım spotify ve şimdi Xcode önemli ölçüde daha iyi çalışıyor gibi görünüyor.


İlginç, ama benim için Spotify ile ilgili değil ... Ancak bunun sadece "olağan" bir performans sorunu olduğunu gösteriyor - yani - daha fazla kaynağı temizlerseniz daha iyi çalışır. Sağlayacak daha fazla kaynağım olmadığı için bu üzücü (yeni bir Mac'teki para dışında).
mllm

2

Bunun genellikle şu durumlarda olduğunu öğrendim:

  • tek bir ifadede uzun ifadeler var ( bu cevaba bakın )
  • birden çok özel operatörü tek bir ifadede karıştırın

İkinci durum, en son xcode sürümlerinden birinde çözülmüş görünüyor. Örnek: <&&> ve <||> 2 özel işleci tanımladım ve şöyle bir ifadede kullandım:a <&&> b <&&> c <||> d . Birden fazla satıra bölmek sorunu çözdü:

let r1 = a <&&> b
let r2 = r1 <&&> c
let r3 = r2 <||> d

Umarım davalarınız yukarıdaki 2'den birinin kapsamındadır ... lütfen her iki durumda da yorum yapın


5
Ne yazık ki, içinde hiçbir şey olmayan ve "var s: Stri ..." gibi basit bir şey yazarak yepyeni ve temiz bir projede de oluyor. St yazmaya başlar başlamaz, tamamlama önerilerini ararken yavaşlayacak.
mllm

Kesinlikle benim için işlenenler. Aynı satırda birden fazla işlenen olması buna neden olur. Cevap için teşekkürler. Doğru cevap bu olmalı
Kesava

2

Xcode 6.3'te bile aynı sorunları yaşadım

  • süper yavaş otomatik tamamlamalar
  • süper yavaş indeksleme
  • swift ve SourceKitService ile muazzam CPU kullanımı
  • SourceKitService tarafından muazzam Bellek kullanımı

Bütün bunlar nispeten küçük bir projede bile oluyordu. Bulabildiğim tüm düzeltmeleri denedim:

  • ~ / Library / Developer / Xcode / DerivedData / * siliniyor
  • ~ / Library / Caches / com.apple.dt.Xcode / * siliniyor
  • koddan tüm "+" Dize birleşimini kaldır
  • tüm şüpheli sözlük bildirimlerini kaldırdı

Bunların hiçbiri aslında projeme yardımcı olmadı.

Sorunumu gerçekten çözen şey şuydu:

  • her bir ucu her sınıfı kendi dosyasına yerleştirmek
  • her bir uzantıyı kendi dosyasına yerleştirmek (Class + ExtName.swift)
  • kendi dosyasında "sınıf dışı hızlı yöntemleri" yerleştirmek

Artık sıfıra yakın CPU kullanımı, düşük bellek kullanımı ve oldukça hızlı tamamlamalarım var.


2

Genel olarak, önbellek klasörünü (DerivedData) bir SSD sürücüsüne (özellikle benim durumumda - Thunderbolt çıkışına bağlı bir dış depolama) taşımak, Xcode performansımı önemli ölçüde artırdı. Derleme süresi ve uygulama etrafındaki genel merak yaklaşık 10 kat daha hızlıdır .. Ayrıca git klasörünün tamamını SSD'ye taşıdı ve bu da git performansını önemli ölçüde artırdı.


Aslında orijinal problemde mac'umu SSD sürücüsüyle zaten yükseltmiştim ve her şey ondan çalıştı. işletim sistemi ve hala sorunlar vardı
mllm

2

XCode 7.2'ye kadar bir sıkıntıydı.

Apple bunu XCode 7.3'te düzeltti ve şimdi bir cazibe gibi çalışıyor. Süper hızlı ve çok daha güçlüdür, çünkü biraz dosya araması gibi çalışır: önermeler listesinde görünmesi için aslında yöntemin / özelliğin tam başlangıcını yazmanız gerekmez.


2

Tüm yöntemleri daraltmak biraz yardımcı olur.

command-alt-shift-sol ok hile yapacak ...

Mevcut yöntemleri katlamak / açmak için veya yapılar kullanıyorsa:

Katla: komut-alt-sol ok

Aç: komut-alt-sağ ok


1

SourceKitServicekoddaki yorumlarla başa çıkmak için biraz beceriksizdir ve gömülü yorumlar da onu yavaşlatır.

Öyleyse, bunun gibi büyük gömülü yorum blobunu kaldırabilirseniz:

/*
 * comment 
    /*
     * embedded comment
     */
 */

bu da kesinlikle yardımcı olabilir.


NOT: Benim durumumda, Xcode 7.3.1 (7D1014), dosyada gömülü yorumlarla birlikte yaklaşık 700 satır yorum olduğunda herhangi bir harfi yazmamı tam anlamıyla engelledi. Başlangıçta bu bloğu o .swiftdosyadan kaldırdım ve Xcode yeniden canlandı. Yorumlarımı katıştırılmış yorumları kaldırarak parça parça eklemeyi denedim, yine de normalden daha yavaştı ancak katıştırılmış yorum yoksa önemli ölçüde daha iyi performans gösterdi.


1

Yazmanın belirli bir sınıfta geciktiği aynı sorunu yaşadım ve ortaya çıktı ki

/* Long multiline comments */

yazmayı yavaşlatıyordu.

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.