스위프트 초 저속 타이핑 및 자동 완성 기능이있는 Xcode 6


114

나만 또는 Xcode 6 (6.0.1) with Swift가 코드를 입력 할 때 특히 자동 완성 기능을 사용할 때 매우 느린 것 같 습니까?

일반적인 Objective-C 클래스는 Swift 프로젝트 내부에 있더라도 이전과 거의 동일하게 작동하므로이를 죽이는 것은 Swift입니다.

다른 사람도 같은 불편을 겪고 있습니까? 성능을 향상시키는 방법에 대해 알고 있습니까?

  • 나는 몇 가지 설정을 가지고 놀려고했지만 운이 없었다.
  • 물론 Xcode와 컴퓨터를 다시 시작하려고 시도했습니다.
  • 다른 무거운 앱은 열려 있지 않습니다.

나는 8GB RAM과 SSD HD가 장착 된 Mid 2009 Macbook Pro (2.26GHz Intel Core 2 Duo)를 사용하는데, 이는 전혀 최신 제품은 아니지만 여전히 완전한 쓰레기는 아닙니다.

Swift 사용을 시작하게되어 정말 부끄럽습니다. 이제 정말 견딜 수 없습니다.

생각 / 팁?


1
당신과 같은 문제가 있습니다. 종종 Xcode에서 "SourceKit이 종료되었습니다. 편집기가 일시적으로 제한되었습니다."라는 메시지가 표시됩니다.
idmean

예, 이것은 또 다른 문제입니다. 그래도 관련이 있는지 잘 모르겠습니다. 그 오류가 발생하더라도 속도가 느 렸습니다.
mllm 2014 년

1
나는 그들이 관련이 있다고 확신합니다. 베타 5에서 나는 그 메시지를 더 자주 보았고, 제안이 작동하지 않을 때마다 그것을 보았다. (내가 일부 문자를 입력하고 Esc를 눌러 제안을 트리거했을 때)
idmean

1
나도 같은 문제가있어. 내 XCode는 CPU의 300 % 이상을 사용하고 맥북 망막을 달팽이 속도로 느리게합니다. 나는 요즘 거의 맹목적으로 타이핑하고 xcode가 완료되기를 기다립니다.
pkuhar

1
8GB RAM 및 SSD가 장착 된 2011 년 말 15.6 형 MacBook Pro에서 동일한 문제가 발생했습니다. 시간 코드 완료의 90 %가 Xcode를 멈 춥니 다. 활동 모니터를 확인하면 CPU 사용량이 ~ 200 % 인 것으로 보입니다. 몇 초 후에 멈 춥니 다. 몇 분.
isair

답변:


86
  • Xcode를 종료하고 Mac을 재시동 할 필요는 없지만 선호합니다.
  • ~ / Library / Developer / Xcode / DerivedData 폴더 의 내용 을 삭제합니다.
  • 내용 삭제 ~ / Library / Caches / 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 2014

이 두 폴더에서 모든 콘텐츠를 제거하는 데 거의 1 분 정도 걸렸습니다. 이제 Xcode에서 인덱싱하는 데 30 초도 걸리지 않습니다.
Eneko Alonso 2015 년

타이핑과 자동 완성 속도가 빨라지지는 않았지만 Mac에서 많은 공간을 확보하는 데 도움이되었습니다.
스콧 Zhu의

이 답변은 자동 완성 일에 도움이 stackoverflow.com/a/29849869/1213267
스콧 Zhu의를

13

또한 "간단한"코드를 입력하는 동안 100 % 이상의 CPU를 경험했습니다. 코드를 구조화하는 방식으로 신속 파서를 더 빠르게 만드는 몇 가지 작은 트릭.

문자열에서 "+"연결자를 사용하지 마십시오. 나에게 이것은 매우 빠르게 느려짐을 유발합니다. 각각의 새로운 "+"는 파서를 크롤링하고 함수 본문의 어딘가에 새 문자를 추가 할 때마다 코드를 다시 구문 분석해야합니다.

대신에:

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

신속하게 구문 분석하는 데 훨씬 더 효율적인 템플릿 구문을 사용하십시오.

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

이렇게하면 기본적으로 인라인 vars "\ (*)"로 strlen에 제한이 없음을 알 수 있습니다.

+ / *-를 사용하는 계산이 있으면 더 작은 부분으로 나눕니다.

대신에:

var result = pi * 2 * radius 

사용하다:

var result  = pi * 2
    result *= radius

덜 효율적으로 보일 수 있지만 빠른 파서는이 방식으로 훨씬 빠릅니다. 일부 수식은 수학적으로 정확하더라도 많은 연산이 필요하면 컴파일되지 않습니다.

복잡한 계산이 있으면 func에 넣으십시오. 이렇게하면 파서가 한 번 파싱 할 수 있으며 함수 본문에서 무언가를 변경할 때마다 다시 파싱 할 필요가 없습니다.

함수 본문에 계산이 있으면 유형, 구문 등이 여전히 올바른지 여부를 매번 빠른 파서가 확인하기 때문입니다. 선이 계산 위로 변경되면 계산 / 공식 내의 일부 변수가 변경되었을 수 있습니다. 외부 기능에 넣으면 한 번 유효성이 검사되고 정확하고 지속적으로 재분석하지 않아 CPU 사용량이 높아집니다.

이렇게하면 입력하는 동안 각 키를 누를 때마다 100 %에서 CPU가 낮아졌습니다. 예를 들어 함수 본문에 인라인으로 배치 된이 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 as AnyObject"와 같이 여전히 많은 타입 캐스팅이 필요하지만 복잡한 목표 -c 프로젝트 구조 및 구문에 비해 더 작은 악입니다.

또한 또 다른 경험으로 SpriteKit을 사용해 보았습니다. 사용하기는 재미 있지만 60fps에서 지속적으로 다시 칠할 필요가 없으면 매우 비효율적입니다. "스프라이트"가 자주 변경되지 않는 경우 이전 CALayers를 사용하는 것이 CPU에 훨씬 좋습니다. 레이어의 .contents를 변경하지 않으면 CPU가 기본적으로 유휴 상태이지만 백그라운드에서 실행중인 SpriteKit 앱이있는 경우 제한적인 60fps 업데이트 루프로 인해 다른 앱의 비디오 재생이 끊길 수 있습니다.

컴파일하는 동안 xcode가 이상한 오류를 표시하는 경우 "Product> Clean"메뉴로 이동하여 다시 컴파일하는 데 도움이됩니다. 캐시의 버그가있는 구현 인 것 같습니다.

xcode가 코드에 갇혀있을 때 구문 분석을 개선하는 또 다른 좋은 방법은 여기에 있는 다른 stackoverflow 게시물에 언급되어 있습니다 . 기본적으로 .swift 파일의 모든 내용을 외부 편집기로 복사 한 다음 기능별로 다시 복사하여 병목 지점을 확인합니다. 이것은 실제로 내 프로젝트가 100 % CPU에 미친 후 xcode를 다시 합리적인 속도로 얻는 데 도움이되었습니다. 코드를 다시 복사하는 동안 코드를 리팩터링하고 함수 본문을 짧게 유지하고 함수 / 공식 / 표현식을 단순하게 (또는 여러 줄로 분할) 시도 할 수 있습니다.


매우 철저한 답변입니다. 일부 제안은 "응급 처치"로 훌륭 할 수도 있지만 실제로는 Xcode가 큰 번거 로움없이 간단히 작동 할 것이라고 기대하지 않습니까?
mllm

1
안타깝게도 xcode 6.1 + swift는 매우 불안정하므로 이러한 "해킹"이 필요합니다. Apple은 swift와 xcode를 수정해야합니다. 그러나 swift는 프로그래밍하기에 매우 좋으므로 단기적으로 CPU 사용을 막을 수있는 유일한 방법입니다.
Daniel Unterberger 2014

나는 당신이 제안하는 모든 가능한 변경을했지만 불행히도 내 자동 완성은 여전히 ​​엉망입니다. 축약 형 if 절도 문제를 일으킬 수 있는지 의심됩니다. 누구든지 인정할 수 있습니까? 나는 return (a == b)을 의미합니까? x : y
Ilker Baltaci 2014

음, IDE의 행복을 만들 수있는 어떤 방법으로 코드를 작성하는 것은 정말 넌센스입니다
안드레이 고르 디프

10

Xcode 4부터 자동 완성 기능이 손상되었습니다. Apple이이 2 년 된 버그를 수정하기로 결정할 때까지 유일한 해결책은 XCode의 기본 설정에서 코드 완성 기능을 끄는 것 입니다 (아래 그림의 첫 번째 옵션).

입력 CTRL space하거나 ESC필요할 때 수동으로 완료를 계속 즐길 수 있습니다 .

이것은 모든 경우에 대해 매번 작동하는 유일한 솔루션입니다.

여기에 이미지 설명 입력

최근에 제가 발견 한 또 다른 사실은 : Xcode에서 플러그인을 사용한다면 사용하지 마십시오. 모두 제거하십시오. 그들은 문제를 더 악화시킵니다.


5

Spotify를 사용하고 있습니까? 동일한 문제가있는 2009 년 중반 (2.66Ghz) iMac에 Xcode 6.1 GM과 함께 Yosemite GM을 설치했습니다. "SpotifyWebHelper"라는 프로세스가 항상 응답하지 않는 것으로 빨간색으로 표시되어 "웹에서 시작"옵션을 비활성화했습니다. spotify와 이제 Xcode가 훨씬 더 잘 실행되는 것 같습니다.


흥미롭지 만 저에게는 Spotify와 관련이 없습니다 ... 그러나 그것은 단지 "일반적인"성능 문제라는 것을 보여줍니다-의미-더 많은 리소스를 지우면 더 잘 작동 할 것입니다. 더 이상 제공 할 리소스가 없기 때문에 슬프다 (새 Mac의 돈을 제외하고).
mllm 2014 년

2

일반적으로 다음과 같은 경우에 발생합니다.

두 번째 경우는 최신 xcode 릴리스 중 하나에서 수정 된 것 같습니다. 예 : 2 개의 사용자 지정 연산자 <&&> 및 <||>를 정의하고 a <&&> b <&&> c <||> d. 여러 줄로 나누면 문제가 해결되었습니다.

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

귀하의 사례가 위의 두 가지 중 하나에 포함되기를 바랍니다. 두 경우 모두 의견을 게시하십시오.


5
안타깝게도 새 프로젝트에서도 "var s : Stri ..."와 같이 간단한 내용을 입력하지 않은 상태에서 발생합니다. St 입력을 시작하자마자 완성 제안을 찾을 때 느려질 것입니다.
mllm 2014 년

확실히 나를위한 피연산자입니다. 같은 줄에 피연산자가 두 개 이상 있으면이 문제가 발생합니다. 답변 해주셔서 감사합니다. 이것이 정답이어야합니다
Kesava

2

Xcode 6.3에서도 동일한 문제가 발생했습니다.

  • 매우 느린 자동 완성
  • 매우 느린 인덱싱
  • swift 및 SourceKitService에 의한 엄청난 CPU 사용량
  • SourceKitService의 엄청난 메모리 사용량

이 모든 일은 비교적 작은 프로젝트에서도 일어났습니다. 찾을 수있는 모든 수정을 시도했습니다.

  • ~ / Library / Developer / Xcode / DerivedData / * 삭제
  • ~ / Library / Caches / com.apple.dt.Xcode / * 삭제
  • 코드에서 모든 "+"문자열 결합 제거
  • 모든 의심스러운 사전 선언을 제거했습니다.

이들 중 어느 것도 실제로 내 프로젝트에 도움이되지 않았습니다.

실제로 내 문제를 해결 한 것은 다음과 같습니다.

  • 모든 클래스를 자체 파일에 배치
  • 각각의 모든 확장자를 자체 파일 (Class + ExtName.swift)에 배치
  • 자체 파일에 "클래스 외부의 신속한 메소드"배치

이제 CPU 사용량이 거의 0에 가까워지고 메모리 사용량이 적으며 상당히 빠른 완료가 있습니다.


2

일반적으로 캐시 폴더 (DerivedData)를 SSD 드라이브 (특히 제 경우에는 Thunderbolt 출구에 연결된 외부 저장소)로 이동하면 Xcode 성능이 크게 향상되었습니다 .. 컴파일 시간과 앱에 대한 일반적인 궁금증이 약 10 배 빨라졌습니다. 또한 전체 git 폴더를 SSD로 이동하여 git 성능을 크게 향상 시켰습니다.


실제로 원래 문제에서 나는 이미 SSD 드라이브로 Mac을 업그레이드했으며 모든 것이 그것에서 실행되었습니다. OS, 여전히 문제가있었습니다
mllm

2

XCode 7.2까지는 고통이었습니다.

Apple은 XCode 7.3에서 수정했으며 이제는 매력처럼 작동합니다. 파일의 퍼지 검색처럼 작동하는 것처럼 보이므로 매우 빠르고 훨씬 강력합니다. 제안 목록에 나타나기 위해 메서드 / 속성의 정확한 시작을 실제로 입력 할 필요는 없습니다.


2

모든 방법을 접 으면 약간 도움이됩니다.

command-alt-shift-left 화살표가 트릭을 수행합니다 ...

현재 메서드를 접거나 펼치려면 또는 구조가 다음을 사용하는 경우 :

접기 : command-alt-left 화살표

펼치기 : command-alt-right 화살표


1

SourceKitService또한 코드의 주석을 처리하기가 다소 어색하며 삽입 된 주석도 속도를 늦 춥니 다.

따라서 다음과 같이 포함 된 주석의 방대한 덩어리를 제거 할 수있는 경우 :

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

그것은 확실히 도움이 될 수 있습니다.


참고 : 제 경우에는 파일에 주석이 포함 된 약 700 줄의 주석이있을 때 Xcode 7.3.1 (7D1014)이 문자 입력을 차단했습니다. 처음에는 해당 .swift파일 에서 해당 블록을 제거 하고 Xcode가 다시 활성화되었습니다. 삽입 된 댓글을 제거하여 부분적으로 댓글을 추가하려고 시도했지만 여전히 평소보다 느 렸지만 삽입 된 댓글이 없으면 훨씬 더 나은 성능을 보여주었습니다.


1

특정 클래스에서 타이핑이 지연되는 것과 동일한 문제가 있었고

/* Long multiline comments */

타이핑 속도가 느려졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.