programing

Swift 슈퍼 슬로우 타이핑 및 자동 완성 기능을 갖춘 Xcode 6

oldcodes 2023. 5. 24. 22:22
반응형

Swift 슈퍼 슬로우 타이핑 및 자동 완성 기능을 갖춘 Xcode 6

저만 그런가요, 아니면 스위프트의 Xcode 6(6.0.1)이 특히 자동 완성을 통해 코드를 입력할 때 매우 느린 것 같습니까?

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

다른 사람들도 같은 불편함을 느끼나요?성능을 향상시키는 방법에 대해 알고 계십니까?

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

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

스위프트를 사용하기 시작한 것에 흥분해서 지금은 정말 참을 수가 없어 아쉽습니다.

생각/팁?

  • Xcode를 종료하고 Mac을 다시 시작하는 것은 필요하지 않지만 선호됩니다.
  • 폴더 내용 삭제 ~/Library/Developer/Xcode/DerivedData
  • ~/Library/Caches/com.apple.dt 내용을 삭제합니다.엑스코드

이것은 일시적인 해결책이지만 매우 효과적입니다.

스크립트 편집기 앱을 사용하여 스크립트 아래에 있습니다.

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)

swift에서 구문 분석하는 것이 훨씬 효율적인 template-syntax를 사용합니다.

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

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

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

다음 대신:

var result = pi * 2 * radius 

사용:

var result  = pi * 2
    result *= radius

효율성이 떨어지는 것처럼 보일 수도 있지만, 이렇게 하면 빠른 파서가 훨씬 빠릅니다.일부 수식은 수학적으로 정확하더라도 많은 연산이 필요한 경우 컴파일되지 않습니다.

계산이 복잡하면 함수에 입력합니다.이렇게 하면 파서가 한 번 구문 분석할 수 있으며 함수 본문에서 무언가를 변경할 때마다 다시 구문 분석할 필요가 없습니다.

왜냐하면 만약 당신이 당신의 함수 본문에 계산이 있다면, 어떻게든 빠른 파서는 그 종류, 구문 등이 여전히 정확하다면 매번 그것을 확인하기 때문입니다.선이 계산 위에서 변경되면 계산/공식 내부의 일부 변수가 변경되었을 수 있습니다.외부 기능에 넣으면 한번 검증이 되고 swift는 정확한 것을 기뻐하며 끊임없이 재분석을 하지 않아 CPU 사용량이 높습니다.

이 방법으로 나는 각 키 누르기에서 100%에서 타이핑하는 동안 낮은 CPU를 얻었습니다.예를 들어, 함수 본문에 인라인으로 배치된 이 세 줄은 빠른 파서를 크롤로 가져올 수 있습니다.

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에 넣고 나중에 부르면 swift parser가 훨씬 빠릅니다.

// 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 파일을 없애고 훨씬 깨끗한 구문을 사용하기 때문에 저는 swift를 많이 선호합니다."myVar as AnyObject"와 같은 많은 유형 캐스팅이 여전히 필요하지만, 그것은 복잡한 목표-c 프로젝트 구조와 구문에 비해 작은 악입니다.

또 다른 경험으로, 저는 스프라이트 키트를 사용해 보았습니다. 사용하는 것은 재미있지만, 60fps로 지속적으로 다시 칠할 필요가 없다면 상당히 비효율적입니다."스프라이트"가 그렇게 자주 바뀌지 않는다면 기존의 CAL레이어를 사용하는 것이 CPU에 훨씬 더 좋습니다.계층의 .contents를 변경하지 않으면 CPU가 기본적으로 유휴 상태이지만 백그라운드에서 실행 중인 SpriteKit 앱이 있으면 하드 제한된 60fps 업데이트 루프로 인해 다른 앱의 비디오 재생이 중단될 수 있습니다.

컴파일 중 xcode에서 이상한 오류가 나타날 수 있으며, "Product > Clean" 메뉴로 이동하여 다시 컴파일하는 것이 캐시의 버그 구현인 것 같습니다.

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

Xcode 4부터 자동 완성이 중단되었습니다.애플이 이 2년 된 버그를 수정하기로 결정할 때까지, 불행하게도 유일한 해결책은 XCode의 기본 설정(아래 그림의 첫 번째 옵션)에서 코드 완료를 해제하는 것입니다.

입력하여 수동으로 계속 완료할 수 있습니다.CTRL space또는ESC당신이 필요할 때.

이 솔루션은 모든 사례의 100%에 대해 매번 작동하는 유일한 솔루션입니다.

여기에 이미지 설명 입력

제가 최근에 발견한 또 다른 것은 만약 당신이 Xcode에서 플러그인을 사용한다면 하지 말라는 것입니다.모두 제거합니다.그들은 문제를 더 악화시킵니다.

Spotify를 사용하고 있습니까?같은 문제가 있는 2009년 중반(2.66Ghz)의 iMac에 Xcode 6.1 GM을 탑재한 Yosemite GM을 설치했습니다."SpotifyWebHelper"라는 프로세스가 항상 빨간색으로 응답하지 않는 것으로 표시되는 것을 발견하여 Spotify에서 "Start from web" 옵션을 비활성화했고 이제 Xcode가 훨씬 더 잘 실행되는 것 같습니다.

이런 일은 대개 다음과 같은 경우에 발생한다는 것을 알게 되었습니다.

  • 단일 문에 긴 표현식이 있습니다( 답변 참조).
  • 단일 식에 여러 사용자 지정 연산자 혼합

두 번째 케이스는 최신 xcode 릴리즈 중 하나에서 수정된 것 같습니다.예:2개의 사용자 지정 연산자 <&&>와 <|>를 정의하고 다음과 같은 표현으로 사용했습니다.a <&&> b <&&> c <||> d여러 줄로 분할하여 문제를 해결했습니다.

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

당신의 사건이 위의 두 사건 중 하나에 포함되기를 바랍니다.어느 경우든 댓글을 달아주세요.

Xcode 6.3에서도 같은 문제가 있었습니다.

  • 매우 느린 자동 완성
  • 매우 느린 색인화
  • swift 및 SourceKit 서비스의 막대한 CPU 사용량
  • SourceKit 서비스의 엄청난 메모리 사용량

이 모든 것은 상대적으로 작은 프로젝트에서도 일어나고 있었습니다.찾을 수 있는 모든 해결책을 시도했습니다.

  • ~/라이브러리/개발자/X코드/파생 데이터 삭제/*
  • ~/라이브러리/캐시/com.apple.dt를 삭제합니다.Xcode/*
  • 코드에서 모든 "+" 문자열 결합 제거
  • 의심스러운 사전 선언을 모두 제거했습니다.

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

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

  • 각 클래스의 각 끝을 자체 파일에 배치
  • 각 확장명을 자체 파일에 배치(Class+ExtName.swift)
  • 자체 파일에 "Out of class swift 메서드" 배치

이제 CPU 사용량이 거의 없고 메모리 사용량이 낮으며 완료 속도가 상당히 빠릅니다.

일반적으로 캐시 폴더(DerivedData)를 SSD 드라이브(특히 Thunderbolt Exit에 연결된 외부 스토리지)로 이동하면 Xcode 성능이 크게 향상되었습니다.컴파일 시간과 앱 주변의 일반적인 궁금증은 약 10배 더 빠릅니다.또한 전체 Git 폴더를 SSD로 이동하여 Git 성능이 크게 향상되었습니다.

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

애플은 XCode 7.3에서 그것을 고쳤고 이제는 매력적으로 작동합니다.파일의 퍼지 검색처럼 작동하는 것처럼 보이기 때문에 매우 빠르고 훨씬 강력합니다. 제안 목록에 메서드/속성의 정확한 시작을 입력할 필요가 없습니다.

모든 메소드를 접으면 약간의 도움이 됩니다.

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

현재 메서드를 접거나 펼치기 또는 구조물을 사용하는 경우:

접기: 명령-alt-왼쪽 화살표

펼치기: 명령-alt-오른쪽 화살표

SourceKitService코드에 있는 댓글을 처리하는 것도 서툴고 내장된 댓글도 느려집니다.

그래서 만약 당신이 다음과 같은 내장된 댓글의 거대한 덩어리를 제거할 수 있다면:

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

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


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

저는 특정 수업에서 타이핑이 뒤처지는 동일한 문제를 겪었고 알고 보니

/* Long multiline comments */

타이핑 속도를 늦추고 있었습니다.

언급URL : https://stackoverflow.com/questions/25948024/xcode-6-with-swift-super-slow-typing-and-autocompletion

반응형