Xcode 6 с быстрым супер медленным типом и автозаполнением

Является ли это просто мной или Xcode 6 (6.0.1), когда Swift кажется супер медленным при вводе кода, особенно с автозавершением?

Нормальный класс Objective-C, даже если внутри проекта Swift работает почти так же, как и раньше, поэтому Swift убивает его.

Есть ли у кого-нибудь еще такие же неудобства? У вас есть представление о том, как повысить производительность?

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

Я использую Mid Mac Mac Pro Pro (2,26 ГГц Intel Core 2 Duo) с 8 ГБ оперативной памяти и SSD HD, что совсем не самое новое, но все же не полный мусор.

Жаль, что я был очень рад начать использовать Swift, и теперь это действительно невыносимо.

Мысли/советы?

Ответ 1

  • Выйти из Xcode и перезагрузить Mac не требуются, но предпочтительнее.
  • Удалить содержимое папки ~/Library/Developer/Xcode/DerivedData​​li >
  • Удалить контент ~/Library/Caches/com.apple.dt.Xcode

Это временное решение, но работает значительно.

Ниже script с помощью приложения script Editor.

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 в командной строке каждый раз, когда вы хотите очистить эти две папки.

Ответ 2

Я также испытал 100% + CPU при наборе некоторого "простого" кода. Некоторые небольшие трюки, чтобы ускорить быстрый парсер, так как вы структурируете свой код.

Не используйте континент "+" в строках. Для меня это очень быстро вызывает медленность. Каждый новый "+" выводит парсер на обход, и он должен повторно обрабатывать код каждый раз, когда вы добавляете новый char где-то в свой кузов.

Вместо:

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

Используйте синтаксис шаблона, который кажется более эффективным для синтаксического анализа:

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

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

Если у вас есть расчеты, которые используют +/* - затем разбивают их на более мелкие части.

Вместо:

var result = pi * 2 * radius 

использовать:

var result  = pi * 2
    result *= radius

Он может выглядеть менее эффективным, но быстрый парсер намного быстрее. Некоторые формулы не будут компилироваться, если они имеют много операций, даже если они математически правильны.

Если у вас есть сложные вычисления, то положите их в func. Таким образом, синтаксический анализатор может разобрать его один раз и не переписывать его каждый раз, когда вы что-то изменяете в своем теле функции.

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

Таким образом, я получил от 100% каждого нажатия клавиши до низкого уровня процессора при наборе текста. Например, эти 3 строки, встроенные в тело функции, могут привести к сканированию swiftparser.

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 )

но если я поместил его в func и назову позже, 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", но это меньшее зло по сравнению с сложной структурой проекта и синтаксисом objective-c.

Еще один опыт, я попробовал SpriteKit, который очень полезен, но его довольно эффективный, если вам не нужна постоянная перерисовка со скоростью 60 кадров в секунду. Использование старых CALayers намного лучше для CPU, если ваши "спрайты" не так часто меняются. Если вы не меняете .contents слоев, тогда CPU в основном бездействует, но если у вас есть приложение SpriteKit, работающее в фоновом режиме, то видеозапись в других приложениях может начать заикаться из-за ограниченного цикла обновления в 60fps.

Иногда xcode показывает нечетные ошибки при компиляции, затем помогает перейти в меню "Продукт > Очистить" и скомпилировать его снова, кажется, является ошибкой реализации кэша.

Еще один отличный способ улучшить синтаксический анализ, когда xcode застрял с вашим кодом, упоминается в другом postoverflow post здесь. В основном вы копируете все содержимое из вашего .swift файла во внешний редактор, а затем через функцию копируете его и видите, где находится ваше узкое место. Это действительно помогло мне снова получить xcode на разумной скорости, после того, как мой проект сошел с ума со 100% -ым процессором. при копировании кода обратно, вы можете реорганизовать его и попытаться сохранить свои функциональные тела короткими, а функции/формуляры/выражения простыми (или разделить на несколько строк).

Ответ 3

Автокомпьютер сломан с Xcode 4. Пока Apple не решит исправить эту ошибку 2 года, единственным решением, к сожалению, является завершение кода ВЫКЛ по предпочтениям XCode (первый вариант рисунка ниже).

Вы можете продолжить пользоваться завершением вручную, набрав CTRL space или ESC, когда вам это нужно.

Это единственное решение, которое работает каждый раз для 100% случаев.

enter image description here

Еще одна вещь, которую я недавно обнаружил: если вы используете плагины на Xcode, не делайте этого. Удалите их все. Они делают проблему хуже.

Ответ 4

Используете ли вы Spotify? Я установил Yosemite GM с Xcode 6.1 GM на iMac в середине 2009 года (2.66Ghz) с той же проблемой. Я обнаружил, что процесс под названием "SpotifyWebHelper" всегда отмечен красным как не отвечающий, поэтому я отключил опцию "начать с Интернета" в и теперь Xcode выглядит значительно лучше.

Ответ 5

У меня были те же проблемы даже в Xcode 6.3

  • супер медленные автозаполнения
  • супер медленная индексация
  • Огромное использование процессора быстрым и SourceKitService
  • Огромное использование памяти SourceKitService

Все это происходило даже в относительно небольшом проекте. Я пробовал все исправления, которые мог найти:

  • удаление ~/Library/Разработчик/Xcode/DerivedData/*
  • удаление ~/Library/Caches/com.apple.dt.Xcode/*
  • удалить все "+" Строка, объединяющую код
  • удалены все подозрительные словарные объявления

Ничего из этого не помогло в моем проекте.

Что на самом деле решило мою проблему:

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

Теперь у меня почти нет использования ЦП, низкого использования памяти и прилично быстрых завершений.

Ответ 6

Как правило, перемещение папки кэша (DerivedData) на SSD-диск (в частности, в моем случае - внешнее хранилище, связанное с выходом thunderbolt) значительно улучшило мою производительность Xcode. Время компиляции и общее удивление вокруг приложения составляет около 10 раз быстрее. Также переместил всю папку git на SSD, что значительно улучшило производительность git.

Ответ 7

Это была боль до XCode 7.2.

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

Ответ 8

Свертывание всех методов помогает немного.

команда-alt-shift-left стрелка сделает трюк...

Чтобы свернуть/развернуть текущие методы или использовать структуры:

Fold: команда-alt-left arrow

Unfold: command-alt-right arrow

Ответ 9

Я узнал, что обычно это происходит, когда вы:

  • имеют длинные выражения в одном выражении (см. этот ответ)
  • смешивать несколько настраиваемых операторов в одном выражении

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

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

Я надеюсь, что ваши дела охвачены одним из двух выше... Пожалуйста, напишите комментарий в любом случае

Ответ 10

SourceKitService также неловко разбирается с комментариями в коде и встроенными комментариями замедляет работу.

поэтому, если вы можете позволить себе удалить массивный кусок встроенных комментариев, например:

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

которые могут определенно помочь.


ПРИМЕЧАНИЕ: в моем случае мой Xcode 7.3.1 (7D1014) был буквально заблокирован, я набрал любую букву, когда в файле было около 700 строк комментария со встроенными комментариями. сначала я удалил этот блок из этого файла .swift, и Xcode снова стал живым. Я попытался добавить свои комментарии назад частично, удалив встроенные комментарии, но все же медленнее, чем обычно, но показал значительно лучшую производительность, если не было встроенных комментариев.

Ответ 11

У меня была такая же проблема, когда печатание было отстающим в определенном классе и оказалось, что

/* Long multiline comments */

замедлял ввод текста.