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.