Xcode 6 Beta 6을 사용하고 있습니다.
이것은 지금 당장 나를 괴롭힌 적이 있지만 지금은 거의 사용할 수없는 시점에 도달하고 있습니다.
내 프로젝트는 적당한 크기의 65 Swift 파일과 몇 개의 브리지 된 Objective-C 파일 (실제로 문제의 원인이 아님) 을 갖기 시작했습니다 .
응용 프로그램에서 거의 사용되지 않는 클래스에 간단한 공백을 추가하는 것과 같이 Swift 파일을 약간 수정 한 것처럼 지정된 대상의 전체 Swift 파일이 다시 컴파일됩니다.
더 깊이 조사한 결과, 컴파일러 시간의 거의 100 %를 차지하는 것은 CompileSwift
Xcode가 swiftc
대상의 모든 Swift 파일 에서 명령을 실행하는 단계 라는 것을 알았습니다 .
추가 조사를 수행했으며 기본 컨트롤러로 앱 대리자를 유지하면 컴파일 속도가 매우 빨라지지만 점점 더 많은 프로젝트 파일을 추가할수록 컴파일 시간이 느려지기 시작했습니다.
이제 65 개의 소스 파일 만 있으면 매번 컴파일하는 데 약 8/10 초가 걸립니다. 전혀 빠르지 는 않습니다.
나는 제외하고는이 문제에 대해 이야기 사후 보지 못했지만 이 일을 하지만 그 경우에 하나의이야 만약 내가 궁금하네요 그래서 엑스 코드 (6)의 이전 버전을했다.
최신 정보
Alamofire , Euler 및 CryptoSwift 와 같은 GitHub 에서 몇 가지 Swift 프로젝트를 확인 했지만 실제로 비교할 충분한 Swift 파일이 없었습니다. 내가 적당한 크기의 프로젝트를 시작한 것으로 밝혀진 유일한 프로젝트 는 SwiftHN 이며, 소스 파일이 수십 개인데도 여전히 동일한 것을 확인할 수 있었고, 간단한 공간 하나와 전체 프로젝트를 다시 컴파일해야했습니다. 작은 시간 (2/3 초).
분석기와 컴파일이 빠르게 진행되는 Objective-C 코드와 비교할 때, 이것은 스위프트가 큰 프로젝트를 처리 할 수 없을 것 같지만, 내가 틀렸다고 말해주십시오.
Xcode 6 베타 7로 업데이트
여전히 개선이 없습니다. 이 말이 터지기 시작했습니다. #import
스위프트 (Swift) 가 없기 때문에 애플이 어떻게 이것을 최적화 할 수 있을지 모르겠다.
Xcode 6.3 및 Swift 1.2로 업데이트
Apple은 증분 빌드 (및 기타 많은 컴파일러 최적화)를 추가했습니다. 이러한 이점을 보려면 코드를 Swift 1.2로 마이그레이션해야하지만 Apple은 Xcode 6.3에 도구를 추가하여 다음과 같은 이점을 제공합니다.
하나
내가 한 것처럼 너무 빨리 기뻐하지 마십시오. 빌드 증분을 만드는 데 사용하는 그래프 솔버는 아직 잘 최적화되지 않았습니다.
실제로 함수 서명 변경 사항을 보지 않으므로 한 방법의 블록에 공백을 추가하면 해당 클래스에 따른 모든 파일이 다시 컴파일됩니다.
둘째, 변경 사항이 영향을 미치지 않더라도 다시 컴파일 된 파일을 기반으로 트리를 만드는 것 같습니다. 예를 들어,이 세 클래스를 다른 파일로 옮길 경우
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
이제 수정 FileA
하면 컴파일러가 FileA
다시 컴파일되도록 표시 됩니다. 또한 재 컴파일합니다 FileB
(즉의 변경에 따라 확인 될 것이다 FileA
), 그러나 또한 FileC
있기 때문에 FileB
다시 컴파일하고 있기 때문에 그것은 아주 나쁜는 FileC
절대 사용하지 않습니다 FileA
여기.
의존성 트리 솔버가 개선되기를 바랍니다 .이 샘플 코드 로 레이더 를 열었습니다 .
Xcode 7 베타 5 및 Swift 2.0으로 업데이트
어제 Apple은 베타 5를 출시했으며 릴리스 노트에서 다음과 같이 볼 수 있습니다.
Swift Language & Compiler • 증분 빌드 : 함수 본문 만 변경해도 더 이상 종속 파일이 다시 작성되지 않아야합니다. (15352929)
나는 그것을 시도했고 그것이 실제로 (정말!) 잘 작동한다고 말해야합니다. 그들은 증분 빌드를 신속하게 최적화했습니다.
swift2.0
XCode 7 베타 5를 사용하여 브랜치 를 만들고 코드를 최신 상태로 유지 하는 것이 좋습니다 . 컴파일러의 향상된 기능에 만족할 것입니다 (그러나 XCode 7의 글로벌 상태는 여전히 느리고 버그가 있습니다)
Xcode 8.2로 업데이트
이 문제에 대한 마지막 업데이트 이후 오랜 시간이 지났습니다.
우리의 응용 프로그램은 이제 거의 독점적으로 Swift 코드의 약 20k 줄입니다. 스위프트 2와 스위프트 3 마이그레이션보다 빠릅니다. 2014 년 중반 Macbook Pro (2.5GHz Intel Core i7)에서 컴파일하는 데 약 5 / 6m가 소요되며 이는 깔끔한 빌드에서는 괜찮습니다.
그러나 애플이 다음과 같이 주장하지만 증분 빌드는 여전히 농담입니다.
Xcode는 작은 변경 사항이 발생한 경우 전체 대상을 다시 작성하지 않습니다. (28892475)
분명히 나는 우리 중 많은 사람들 이이 넌센스를 확인한 후 웃었다 고 생각합니다 (프로젝트의 파일에 하나의 개인 (개인!) 속성을 추가하면 전체가 다시 컴파일됩니다 ...)
Apple 개발자 포럼 에서이 문제에 대해 더 많은 정보를 제공하는 스레드 를 지적하고 싶습니다 (이 문제에 대한 Apple 개발자의 커뮤니케이션에 감사드립니다)
기본적으로 사람들은 증분 빌드를 개선하기 위해 몇 가지를 생각해 냈습니다.
- 로
HEADER_MAP_USES_VFS
설정된 프로젝트 설정 추가true
Find implicit dependencies
당신의 계획에서 비활성화- 새 프로젝트를 작성하고 파일 계층을 새 프로젝트로 이동하십시오.
솔루션 3을 시도하지만 솔루션 1/2은 우리에게 효과가 없었습니다.
이 전체 상황에서 아이러니하게도 재미있는 것은 우리가 Xcode 6을 사용하고있는이 문제에 대한 첫 번째 게시물을 살펴보면 첫 번째 컴파일 부진에 도달했을 때 swift 1 또는 swift 1.1 코드를 믿으며 약 2 년 후에 Apple의 실제 개선에도 불구하고 상황은 Xcode 6에서와 마찬가지로 나빴습니다.
사실은 정말 그것 때문에 포함 매일 좌절의 우리의 프로젝트의 Obj / C를 통해 스위프트을 선택 후회. (나는 심지어 AppCode로 전환하지만 다른 이야기입니다)
어쨌든 나는이 SO 게시물 이이 글을 쓰는 시점에서 32k + 조회수와 143 업을 가지고 있으므로 내가 유일한 사람이 아니라고 생각합니다. 이 상황에 비관적이지만 터널 끝 부분에 약간의 빛이있을 수 있습니다.
시간이 있고 용기가 있다면, 애플이 이것에 대해 레이더를 환영한다고 생각합니다.
다음 시간까지! 건배
Xcode 9로 업데이트
오늘 이것을 우연히 발견 하십시오 . Xcode는 현재 끔찍한 성능을 향상시키기 위해 새로운 빌드 시스템을 조용히 도입했습니다. 작업 공간 설정을 통해 활성화해야합니다.
아직 시도했지만이 게시물이 완료되면 업데이트됩니다. 그래도 유망 해 보인다.