Xcode 6 dengan pengetikan dan pelengkapan otomatis Swift yang super lambat

114

Apakah hanya saya atau Xcode 6 (6.0.1) dengan Swift yang tampaknya sangat lambat saat Anda mengetik kode, terutama dengan pelengkapan otomatis?

Kelas Objective-C normal, bahkan jika di dalam proyek Swift, bekerja hampir sama seperti sebelumnya, jadi Swift yang membunuhnya.

Apakah ada orang lain yang mengalami ketidaknyamanan yang sama? Apakah Anda tahu cara meningkatkan kinerja?

  • Saya mencoba bermain dengan beberapa pengaturan tetapi tidak berhasil.
  • Saya juga tentu saja mencoba me-restart Xcode dan komputer tidak berhasil.
  • Tidak ada aplikasi berat lainnya yang terbuka.

Saya menggunakan Macbook Pro Pertengahan 2009 (2,26 GHz Intel Core 2 Duo) dengan RAM 8GB dan SSD HD, yang sama sekali bukan yang terbaru, tapi masih belum lengkap.

Ini memalukan karena saya sangat bersemangat untuk mulai menggunakan Swift dan sekarang sangat tidak tertahankan.

Pikiran / tips?

mllm
sumber
1
Saya mengalami masalah yang sama dengan Anda. Seringkali Xcode memberi tahu saya "SourceKit dihentikan, editor untuk sementara dibatasi"
idmean
Ya, ini juga masalah lain, saya tidak yakin mereka terkait. Itu lambat bahkan ketika kesalahan itu terjadi.
mllm
1
Saya yakin mereka terkait. Dalam beta 5 saya melihat pesan itu lebih sering, dan saya melihatnya kapan saja ketika saran tidak berhasil. (Ketika saya mengetik beberapa karakter dan menekan Esc untuk memicu saran)
idmean
1
Saya memiliki masalah yang sama. XCode saya menggunakan 300% + dari CPU dan memperlambat retina macbook saya hingga kecepatan yang sangat tinggi. Saya cukup banyak mengetik secara membabi buta hari ini dan menunggu xcode selesai.
pkuhar
1
Memiliki masalah yang sama dengan MacBook Pro 15,6 inci akhir 2011 dengan RAM 8 GB dan SSD. 90% dari waktu penyelesaian kode membekukan Xcode, ketika saya memeriksa monitor aktivitas saya melihat ~ 200% penggunaan CPU. Macet berlangsung dari beberapa detik menjadi beberapa menit.
isair

Jawaban:

86
  • Keluar dari Xcode dan mulai ulang Mac tidak diperlukan tetapi lebih disukai.
  • Hapus konten folder ~ / Library / Developer / Xcode / DerivedData
  • Hapus konten ~ / Library / Caches / com.apple.dt.Xcode

Ini adalah solusi sementara, tetapi bekerja dengan sangat baik.

Di bawah skrip menggunakan aplikasi Editor Skrip.

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

Alternatifnya, Anda dapat membuat alias untuk terminal Anda seperti ini:

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

Anda dapat menambahkannya ke Anda ~/.bash_profiledan kemudian mengetik xcodecleanpada baris perintah setiap kali Anda ingin menghapus kedua folder tersebut.

g8production - Daniele Gali8
sumber
Yah, meskipun tidak mendekati sempurna, tampaknya solusi Anda meningkatkannya secara signifikan. Saya akan tandai sebagai pemecahan, karena setelah waktu yang cukup lama ini mungkin yang terbaik yang bisa didapat. Akan senang mendengar tentang orang lain ... Terima kasih banyak!
mllm
Laptop saya membutuhkan waktu hampir satu menit untuk menghapus semua konten dari dua folder tersebut. Pengindeksan di Xcode sekarang membutuhkan waktu kurang dari 30 detik.
Eneko Alonso
Itu tidak membuat pengetikan dan pelengkapan otomatis saya lebih cepat, tetapi membantu saya membebaskan cukup banyak ruang dari Mac saya.
Scott Zhu
Jawaban ini membantu dalam hal pelengkapan otomatis, stackoverflow.com/a/29849869/1213267
Scott Zhu
13

Saya juga mengalami 100% + CPU saat mengetik beberapa kode "sederhana". Beberapa trik kecil untuk membuat pengurai cepat lebih cepat dengan cara Anda menyusun kode.

Jangan gunakan concatinator "+" dalam string. Bagi saya ini memicu kelambatan dengan sangat cepat. Setiap "+" baru membawa parser ke crawl, dan kode tersebut harus reparse setiap kali Anda menambahkan karakter baru di suatu tempat di badan fungsi Anda.

Dari pada:

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

Gunakan sintaks-template yang tampaknya jauh lebih efisien untuk diurai dengan cepat:

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

Dengan cara ini pada dasarnya saya tidak melihat batasan dalam strlen dengan inline vars "\ (*)".

Jika Anda memiliki perhitungan, yang menggunakan + / * - maka bagi menjadi bagian-bagian yang lebih kecil.

Dari pada:

var result = pi * 2 * radius 

menggunakan:

var result  = pi * 2
    result *= radius

Ini mungkin terlihat kurang efisien, tetapi pengurai cepat jauh lebih cepat dengan cara ini. Beberapa rumus tidak dapat dikompilasi, jika memiliki banyak operasi, meskipun secara matematis benar.

Jika Anda memiliki beberapa kalkulasi yang kompleks, masukkan ke dalam func. Dengan cara ini pengurai dapat menguraikannya sekali dan tidak harus mengulanginya setiap kali Anda mengubah sesuatu di badan fungsi Anda.

Karena jika Anda memiliki kalkulasi di badan fungsi Anda, maka parser swift akan memeriksanya setiap saat jika jenis, sintaks, dll. Masih benar. Jika garis berubah di atas kalkulasi, maka beberapa vars di dalam kalkulasi / rumus Anda mungkin telah berubah. Jika Anda meletakkannya di fungsi eksternal maka itu akan divalidasi sekali dan swift senang bahwa itu akan benar dan tidak mengulanginya terus-menerus, yang menyebabkan penggunaan CPU yang tinggi.

Dengan cara ini saya mendapatkan dari 100% pada setiap penekanan tombol ke CPU rendah saat mengetik. Misalnya, 3 baris ini yang diletakkan sejajar di badan fungsi Anda dapat membuat swiftparser merayap.

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 )

tetapi jika saya memasukkannya ke dalam func dan memanggilnya nanti, swiftparser jauh lebih cepat

// 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 dan XCode 6.1 masih sangat bermasalah, tetapi jika Anda mengikuti trik sederhana ini, kode pengeditan menjadi dapat diterima lagi. Saya lebih suka cepat, karena menghapus file .h dan menggunakan sintaks yang jauh lebih bersih. Masih ada banyak tipe-casting yang dibutuhkan seperti "myVar as AnyObject", tapi itu kejahatan yang lebih kecil dibandingkan dengan struktur dan sintaks proyek objektif-c yang kompleks.

Juga pengalaman lain, saya mencoba SpriteKit, yang menyenangkan untuk digunakan, tetapi cukup tidak efisien jika Anda tidak memerlukan pengecatan ulang konstan pada 60fps. Menggunakan CALayer lama jauh lebih baik untuk CPU jika "sprite" Anda tidak sering berubah. Jika Anda tidak mengubah. Konten lapisan maka CPU pada dasarnya tidak aktif, tetapi jika Anda memiliki aplikasi SpriteKit yang berjalan di latar belakang, maka pemutaran video di aplikasi lain mungkin mulai tersendat karena loop pembaruan 60fps yang tidak terbatas.

Kadang-kadang xcode menunjukkan kesalahan ganjil saat kompilasi, kemudian masuk ke menu "Produk> Bersihkan" dan kompilasi lagi, tampaknya merupakan implementasi cache yang bermasalah.

Cara hebat lainnya untuk meningkatkan penguraian ketika xcode macet dengan kode Anda disebutkan di pos stackoverflow lain di sini . Pada dasarnya Anda menyalin semua konten dari file .swift Anda ke editor eksternal, dan kemudian berfungsi dengan fungsi menyalinnya kembali dan melihat di mana kemacetan Anda. Ini benar-benar membantu saya mendapatkan xcode ke kecepatan yang wajar lagi, setelah proyek saya menjadi gila dengan 100% CPU. saat menyalin kode Anda kembali, Anda dapat memfaktorkan ulang dan mencoba untuk menjaga agar fungsi-badan Anda tetap pendek dan fungsi / formulars / ekspresi sederhana (atau terbagi dalam beberapa baris).

Daniel Unterberger
sumber
Jawaban yang sangat teliti. Mungkin beberapa dari saran itu bagus sebagai "pertolongan pertama", tapi sungguh, bukankah kita berharap Xcode bekerja begitu saja tanpa melalui kerumitan besar?
mllm
1
sayangnya xcode 6.1 + swift cukup tidak stabil, jadi “peretasan” ini diperlukan. Apple harus memperbaiki swift dan xcode. Tapi swift sangat bagus untuk diprogram, jadi dalam jangka pendek ini adalah satu-satunya cara untuk mencegah Penggunaan CPU.
Daniel Unterberger
saya membuat semua kemungkinan perubahan yang Anda usulkan, tetapi sayangnya pelengkapan otomatis saya masih menyebalkan. Saya ragu singkatan itu jika klausul juga dapat membuat masalah. Adakah yang bisa mengetahuinya? Maksud saya kembali (a == b)? x: y
Ilker Baltaci
Nah, menulis kode dengan cara tertentu untuk membuat IDE menyenangkan adalah omong kosong
Andrey Gordeev
10

Pelengkapan otomatis rusak sejak Xcode 4. Hingga Apple memutuskan untuk memperbaiki bug berusia 2 tahun ini, satu-satunya solusi, sayangnya, adalah MENONAKTIFKAN pelengkapan kode pada preferensi XCode (opsi pertama dari gambar di bawah).

Anda dapat terus menikmati penyelesaian secara manual dengan mengetik CTRL spaceatau ESCsaat Anda membutuhkannya.

Ini adalah satu-satunya solusi yang bekerja setiap saat untuk 100% kasus.

masukkan deskripsi gambar di sini

Hal lain yang saya temukan baru-baru ini adalah: jika Anda menggunakan plugin di Xcode, jangan. Hapus semuanya. Mereka memperburuk masalah.

bebek
sumber
5

Apakah Anda menggunakan Spotify? Saya menginstal Yosemite GM dengan Xcode 6.1 GM pada iMac pertengahan 2009 (2.66Ghz) mengalami masalah yang sama. Saya menemukan bahwa proses yang disebut "SpotifyWebHelper" selalu ditandai merah sebagai tidak merespons, jadi saya menonaktifkan opsi "mulai dari web" di spotify dan sekarang Xcode tampaknya berjalan jauh lebih baik.

Eugenio Baglieri
sumber
Menarik, tapi bagi saya ini tidak terkait dengan Spotify ... Namun hal itu menunjukkan mungkin bahwa itu hanya masalah kinerja "biasa" - artinya - membersihkan lebih banyak sumber daya dan itu akan bekerja lebih baik. Itu menyedihkan karena saya tidak punya lagi sumber daya untuk disediakan (selain dari uang di Mac baru).
mllm
2

Saya menemukan bahwa biasanya terjadi ketika Anda:

  • memiliki ekspresi panjang dalam satu pernyataan (lihat jawaban ini )
  • gabungkan beberapa operator ubahsuaian dalam satu ekspresi

Kasus kedua tampaknya diperbaiki di salah satu rilis xcode terbaru. Contoh: Saya mendefinisikan 2 operator khusus <&&> dan <||>, dan digunakan dalam ekspresi seperti a <&&> b <&&> c <||> d. Memisahkan menjadi beberapa baris menyelesaikan masalah:

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

Saya harap kasus Anda tercakup oleh salah satu dari 2 di atas ... silakan kirim komentar untuk kasus mana pun

Antonio
sumber
5
Sayangnya itu juga terjadi dalam proyek bersih baru tanpa apa pun di dalamnya dan dengan mengetik sesuatu yang sederhana seperti "var s: Stri ...". Begitu saya mulai mengetik St ... itu akan lamban saat mencari saran penyelesaian.
mllm
Ini pasti operan untukku. Memiliki lebih dari satu operan di baris yang sama menyebabkannya. Terima kasih atas jawabannya. Ini seharusnya jawaban yang benar
Kesava
2

Saya memiliki masalah yang sama bahkan di Xcode 6.3

  • pelengkapan otomatis super lambat
  • pengindeksan super lambat
  • penggunaan CPU yang sangat besar dengan swift dan SourceKitService
  • penggunaan Memori yang sangat besar oleh SourceKitService

Semua ini terjadi bahkan dalam proyek yang relatif kecil. Saya mencoba semua perbaikan yang dapat saya temukan:

  • menghapus ~ / Library / Developer / Xcode / DerivedData / *
  • menghapus ~ / Library / Caches / com.apple.dt.Xcode / *
  • hapus semua kombinasi String "+" dari kode
  • menghapus semua deklarasi kamus yang mencurigakan

Tak satu pun dari ini benar-benar membantu dalam proyek saya.

Apa yang sebenarnya memecahkan masalah saya adalah:

  • menempatkan setiap ujung setiap kelas di filenya sendiri
  • menempatkan setiap ekstensi di filenya sendiri (Class + ExtName.swift)
  • menempatkan "metode cepat di luar kelas" dalam filenya sendiri

Sekarang saya hampir tidak menggunakan CPU, penggunaan memori rendah, dan penyelesaian cukup cepat.

Matej Ukmar
sumber
2

Secara umum, memindahkan folder cache (DerivedData) ke drive SSD (khususnya dalam kasus saya - penyimpanan luar yang terhubung ke pintu keluar petir) telah secara dramatis meningkatkan kinerja Xcode saya .. Waktu kompilasi dan pertanyaan umum seputar aplikasi sekitar 10 kali lebih cepat .. Juga memindahkan seluruh folder git ke SSD, yang secara dramatis meningkatkan kinerja git.

brkeyal
sumber
Sebenarnya dalam masalah asli saya sudah memutakhirkan mac saya dengan drive SSD dan semuanya berjalan darinya termasuk. OS, dan masih ada masalah
mllm
2

Itu menyakitkan sampai XCode 7.2.

Apple memperbaikinya di XCode 7.3 dan sekarang berfungsi seperti pesona. Ini super cepat dan jauh lebih kuat karena tampaknya berfungsi seperti pencarian file yang tidak jelas: Anda tidak harus benar-benar mengetik awal yang tepat dari metode / properti agar dapat muncul dalam daftar proposisi.

Bioche
sumber
2

Menciutkan semua metode sedikit membantu.

command-alt-shift-left arrow akan melakukan trik ...

Untuk melipat / membuka metode saat ini atau jika struktur menggunakan:

Lipat: panah kiri-perintah-perintah

Unfold: command-alt-right arrow

gaduh
sumber
1

SourceKitServicejuga agak canggung untuk menangani komentar dalam kode dan komentar yang disematkan juga memperlambatnya.

jadi jika Anda mampu menghapus gumpalan besar dari komentar tersemat seperti ini:

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

itu pasti bisa membantu juga.


CATATAN: dalam kasus saya Xcode 7.3.1 (7D1014) saya benar-benar memblokir saya mengetik surat apa pun ketika file tersebut memiliki sekitar 700 baris komentar dengan komentar yang disematkan. awalnya saya menghapus blok itu dari .swiftfile itu dan Xcode menjadi hidup kembali. Saya mencoba menambahkan komentar saya kembali bagian demi bagian dengan menghapus komentar yang disematkan, itu masih lebih lambat dari biasanya tetapi itu menunjukkan kinerja yang jauh lebih baik jika tidak ada komentar yang disematkan.

holex
sumber
1

Saya memiliki masalah yang sama di mana mengetik tertinggal di kelas tertentu dan ternyata itu

/* Long multiline comments */

memperlambat pengetikan.

Aziz Akgul
sumber