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

나만 또는 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 사용을 시작하게되어 정말 부끄럽습니다. 이제 정말 견딜 수 없습니다.

생각 / 팁?



답변

  • 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.


답변

또한 “간단한”코드를 입력하는 동안 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 4부터 자동 완성 기능이 손상되었습니다. Apple이이 2 년 된 버그를 수정하기로 결정할 때까지 유일한 해결책은 XCode의 기본 설정에서 코드 완성 기능을 끄는 것 입니다 (아래 그림의 첫 번째 옵션).

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

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

여기에 이미지 설명 입력

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


답변

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


답변

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

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

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

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


답변

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

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

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

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

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

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

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

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


답변

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