Xcode 6 із супер повільним набором тексту та автоматичним завершенням Swift


114

Це лише мені чи Xcode 6 (6.0.1) із Swift здається дуже повільним, коли ви вводите код, особливо з автодоповненням?

Нормальний клас Objective-C, навіть якщо всередині проекту Swift, працює майже так само, як і раніше, тож саме Swift вбиває його.

Хтось ще відчуває ті ж незручності? Чи маєте ви якесь уявлення про те, як поліпшити продуктивність?

  • Я намагався грати з деякими налаштуваннями, але не пощастило.
  • Я, звичайно, також намагався перезапустити Xcode та комп'ютер без удачі.
  • Немає інших важких додатків.

Я використовую Macbook Pro середини 2009 року (2,26 ГГц Intel Core 2 Duo) з 8 ГБ оперативної пам’яті та SSD HD, що зовсім не є новітньою річчю, але все ще не повною міткою.

Соромно, коли я був схвильований почати користуватися Swift, і це зараз насправді нестерпно.

Думки / поради?


1
У мене такі самі проблеми, як і у вас. Часто Xcode каже мені "SourceKit припинено, редактор тимчасово обмежений"
idmean

Так, це теж ще одна проблема, але я не впевнений, що вони пов'язані. Це було повільно, навіть коли ця помилка відбувається.
mllm

1
Я впевнений, що вони пов'язані. У бета-версії 5 я бачив це повідомлення ще частіше, і це бачив будь-коли, коли пропозиція не працювала. (Коли я набрав кілька символів і натиснув Esc, щоб викликати пропозицію)
idmean

1
У мене така ж проблема. Мій XCode використовує 300% + процесора і уповільнює сітківку моєї книги вниз до швидкості равлика. Я майже сьогодні набираю сліпого цього дня і чекаю завершення xcode.
пкухар

1
Маючи ті ж самі проблеми з кінцем 2011 року 15.6 "MacBook Pro з 8 ГБ оперативної пам’яті та SSD. 90% часу завершення коду заморожує Xcode, коли я перевіряю монітор активності, я бачу ~ 200% використання процесора. Заморозки тривають через пару секунд до пари хвилин.
isair

Відповіді:


86
  • Закрити Xcode та перезавантажити Mac не потрібно, але бажано.
  • Видаліть вміст папки ~ / Бібліотека / Розробник / Xcode / DerivedData
  • Видаліть вміст ~ / Бібліотека / Кеші / com.apple.dt.Xcode

Це тимчасове рішення, але чудово працює.

Нижче сценарію за допомогою програми редактора сценаріїв.

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

Крім того, ви можете створити псевдонім для свого терміналу таким чином:

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

Ви можете додати це до свого, ~/.bash_profileа потім набрати xcodecleanв командному рядку щоразу, коли ви хочете очистити ці дві папки.


Хоча це не так, щоб бути ідеальним, але схоже, що ваше рішення значно покращує його. Я відзначу це як вирішення, оскільки через досить тривалий час це, мабуть, найкраще, що можна отримати. Буду рада почути про інших ... Дякую велике!
mllm

Моєму ноутбуку знадобилося майже хвилину, щоб видалити весь вміст із цих двох папок. Індексація на Xcode зараз займає менше 30 секунд.
Енеко Алонсо

Це не зробило моє введення тексту та автодоповнення швидше, але це допомогло мені звільнити досить багато місця з мого Mac.
Скотт Чжу

Ця відповідь допомогла вирішити питання про автоматичне завершення, stackoverflow.com/a/29849869/1213267
Скотт Чжу

13

Я також відчував 100% + процесор під час введення «простого» коду. Деякі невеликі хитрощі, щоб зробити швидший аналіз синтаксичним процесом при структуруванні коду.

Не використовуйте конфінатор "+" у рядках. Для мене це викликає повільність дуже швидко. Кожен новий "+" приводить аналізатор до сканування, і він повинен перепаковувати код щоразу, коли ви додаєте нову значку десь у своєму функціональному тілі.

Замість:

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

Використовуйте синтаксис шаблону, який здається набагато ефективнішим для швидкого розбору:

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

Таким чином, я в основному не помічаю обмеження в strlen з вбудованими параметрами "\ (*)".

Якщо у вас є обчислення, в яких використовується + / * - тоді розділіть їх на менші частини.

Замість:

var result = pi * 2 * radius 

використання:

var result  = pi * 2
    result *= radius

Це може виглядати менш ефективно, але швидкий аналізатор набагато швидше. Деякі формули не збираються, якщо вони мають багато операцій, навіть якщо вони математично правильні.

Якщо у вас є складні обчислення, то покладіть їх у функцію. Таким чином, аналізатор може проаналізувати його один раз, і не потрібно його повторно аналізувати кожного разу, коли ви щось змінюєте у своєму функціональному тілі.

Тому що якщо у вас є функція обчислення в тілі функції, то якимось чином швидкий аналізатор перевіряє його щоразу, якщо типи, синтаксис тощо все ще є правильними. Якщо рядок змінюється вище обчислення, то деякі значення у вашому обчисленні / формулі можуть бути змінені. Якщо ви помістите його у зовнішню функцію, вона буде перевірена один раз, і швидкий радий, що вона буде правильною і не перезаписує її постійно, що спричиняє високе використання процесора.

Таким чином я отримав від 100% на кожне натискання клавіш на низький процесор під час набору тексту. Наприклад, ці 3 лінії, розміщені в рядку у вашому функціональному тілі, можуть привести швидкого парзатора до сканування.

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 )

але якщо я покладу його у функцію та зателефоную пізніше, swiftparser - це набагато швидше

// 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 та XCode 6.1 все ще дуже баггі, але якщо дотримуватися цих простих хитрощів, редагування коду знову стає прийнятним. Я більше віддаю перевагу швидкому, оскільки він позбавляється від файлів .h і використовує набагато чистіший синтаксис. Існує ще багато кастингу типів, таких як "myVar як AnyObject", але це менше зло в порівнянні зі складною структурою та синтаксисом проекту target-c.

Також інший досвід, я спробував SpriteKit, який цікаво використовувати, але він досить неефективний, якщо вам не потрібно постійне перефарбовування в 60 кадрів в секунду. Використання старих CALayers набагато краще для процесора, якщо ваші "спрайти" не так часто змінюються. Якщо ви не змінюєте .contents шарів, тоді процесор в основному не працює, але якщо у вас програма SpriteKit працює у фоновому режимі, то відтворення відеозапису в інших додатках може почати заїкатися через жорсткий цикл оновлення 60 кадрів в секунду.

Іноді xcode показує дивні помилки під час компіляції, тоді це допомагає зайти в меню "Product> Clean" та скомпілювати його знову, здається, є помилковою реалізацією кешу.

Ще один чудовий спосіб поліпшити синтаксичний аналіз, коли xcode застрягає з вашим кодом, згадується в іншій публікації stackoverflow тут . В основному ви копіюєте весь вміст із .swift-файлу у зовнішній редактор, а потім за допомогою функції скопіюйте його назад і побачите, де знаходиться вузьке місце. Це фактично допомогло мені знову отримати xcode до розумної швидкості, після того, як мій проект зійшов з розуму зі 100% процесором. під час копіювання вашого коду назад, ви можете перефактурувати його та спробувати забезпечити прості функції (формули / формули / вирази) простими (або розділеними на кілька рядків).


Дуже ретельна відповідь. Можливо, деякі пропозиції чудово підходять як "перша допомога", але насправді, чи не очікуємо, що Xcode просто спрацює, не проходячи величезних клопотів?
mllm

1
на жаль, xcode 6.1 + swift є досить нестабільним, тому ці «хаки» потрібні. Apple має виправити швидкий та xcode. Але швидке дуже приємно програмувати, тому в короткотерміновій перспективі це єдиний спосіб утримати CPU-Usage.
Даніель Унтербергер

Я вніс усі можливі зміни, які ви пропонуєте, але, на жаль, моє автозавершення все ще засихає. Я сумніваюся, що скорочення, якщо пункти також можуть скласти проблеми. Чи хтось може це визнати? Я маю на увазі повернення (a == b)? x: y
Ілкер Балтачі

Ну, писати код певним чином, щоб зробити IDE щасливим - це справжня нісенітниця
Андрій Гордєєв,

10

Автозаповнення порушено з Xcode 4. Поки Apple не вирішить виправити цю дворічну помилку, єдиним рішенням, на жаль, є вимкнення заповнення коду за налаштуваннями XCode (перший варіант малюнка нижче).

Ви можете продовжувати насолоджуватися завершенням вручну, ввівши CTRL spaceабо ESCколи це потрібно.

Це єдине рішення, яке спрацьовує кожен раз у 100% випадків.

введіть тут опис зображення

Ще одна річ, яку я нещодавно виявив: якщо ви використовуєте плагіни на Xcode, не робіть цього. Видаліть їх усіх. Вони посилюють проблему.


5

Ви використовуєте Spotify? Я встановив Yosemite GM з Xcode 6.1 GM на iMac в середині 2009 року (2,66 ГГц), маючи ту ж проблему. Я виявив, що процес під назвою "SpotifyWebHelper" завжди позначається червоним кольором як не відповідає, тому я відключив опцію "запустити з Інтернету" в spotify, і тепер Xcode, здається, працює значно краще.


Цікаво, але для мене це не пов'язано з Spotify ... Однак це, можливо, показує, що це просто "звичайна" проблема продуктивності - це означає - очистити більше ресурсів, і вона буде працювати краще. Це сумно, оскільки у мене більше немає коштів надати (крім грошей на новий mac).
mllm

2

Я дізнався, що зазвичай трапляється, коли ти:

  • мати довгі вирази в одному вислові (див. цю відповідь )
  • змішати кілька спеціальних операторів в одному виразі

2-й випадок, здається, виправлений в одному з останніх версій xcode. Приклад: я визначив 2 користувацьких оператора <&&> і <||>, і використовував у виразі, як a <&&> b <&&> c <||> d. Розщеплення на кілька рядків вирішило проблему:

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

Я сподіваюся, що ваші випадки охоплені одним із 2 вище ... будь ласка, опублікуйте коментар у будь-якому випадку


5
На жаль, це трапляється і в абсолютно новому чистому проекті, в якому нічого немає, і з набором чогось такого простого, як "var s: Stri ...". Як тільки я почну вводити St ..., він буде млявим, коли шукати пропозиції щодо завершення.
mllm

Це безумовно операнди для мене. Наявність більше одного операнда в одному рядку викликає це. Дякую за відповідь. Це має бути правильна відповідь
Кесава

2

У мене були ті самі проблеми навіть у Xcode 6.3

  • супер повільні автозавершення
  • супер повільна індексація
  • величезне використання процесора swift та SourceKitService
  • величезне використання пам'яті SourceKitService

Все це відбувалося навіть у відносно невеликому проекті. Я спробував усі виправлення, які я міг знайти:

  • видалення ~ / Бібліотека / Розробник / Xcode / DerivedData / *
  • видалення ~ / Бібліотека / Кеші / com.apple.dt.Xcode / *
  • видаліть з коду всі "+" рядки, що поєднуються
  • видалено всі підозрілі декларації зі словника

Жодне з них насправді не допомогло в моєму проекті.

Що насправді вирішило мою проблему:

  • розміщення кожного кінця кожного класу у власному файлі
  • розміщення кожного розширення у власному файлі (Class + ExtName.swift)
  • розміщення "швидких методів класу" у власному файлі

Тепер у мене є майже нульове використання процесора, низьке використання пам'яті та пристойно швидке доповнення.


2

Як правило, переміщення папки кеша (DerivedData) на SSD-накопичувач (конкретно в моєму випадку - зовнішнє сховище, підключене до виходу з грому) значно покращило мою продуктивність Xcode .. Час компіляції та загальні цікавлення навколо програми приблизно в 10 разів швидше .. Також перенесла всю папку git на SSD, що значно покращило продуктивність git.


Насправді в оригінальній проблемі я вже оновив свій mac за допомогою SSD-накопичувача, і все працювало з нього в т.ч. ОС, і все-таки виникли проблеми
mllm

2

Болі до XCode 7.2.

Apple виправила це в XCode 7.3 і тепер це працює як шарм. Це дуже швидко і набагато потужніше, оскільки, здається, працює трохи як нечіткий пошук файлів: вам не потрібно фактично вводити точний початок методу / властивості, щоб він відображався у списку пропозицій.


2

Складання всіх методів мало допомагає.

команда alt-shift-стрілка вліво виконає трюк ...

Щоб скласти / розгорнути поточні методи або якщо структури використовують:

Згорнути: команда-alt-ліва стрілка

Розгорнути: команда-alt-вправо


1

SourceKitServiceтакож щось незграбно розглядати коментарі до коду, і вбудовані коментарі також сповільнюють його.

тож, якщо ви можете дозволити собі видалити масивну затірку таких вбудованих коментарів:

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

що, безумовно, може також допомогти.


ПРИМІТКА: у моєму випадку мій Xcode 7.3.1 (7D1014) був буквально заблокований, я вводив будь-який лист, коли у файлі було близько 700 рядків коментарів із вбудованими коментарями. спочатку я видалив цей блок із цього .swiftфайлу, і Xcode знову ожив. Я спробував додавати свої коментарі частково, видаляючи вбудовані коментарі, він все ще був повільніше, ніж зазвичай, але він показав значно кращу ефективність, якщо не було вбудованих коментарів.


1

У мене було те саме питання, коли типізація відставала в певному класі, і виявляється, що

/* Long multiline comments */

сповільнювало введення тексту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.