Tôi đang sử dụng Xcode 6 Beta 6.
Đây là một cái gì đó đã làm tôi khó chịu trong một thời gian, nhưng nó đạt đến điểm mà bây giờ nó hầu như không thể sử dụng được.
Dự án của tôi đang bắt đầu có kích thước khá gồm 65 tệp Swift và một vài tệp Objective-C được bắc cầu (đây thực sự không phải là nguyên nhân của vấn đề).
Có vẻ như bất kỳ sửa đổi nhỏ nào đối với bất kỳ tệp Swift nào (như thêm một khoảng trắng đơn giản trong một lớp hầu như không được sử dụng trong ứng dụng) sẽ khiến toàn bộ tệp Swift cho mục tiêu được chỉ định được biên dịch lại.
Sau khi điều tra sâu hơn, tôi đã thấy rằng những gì đang chiếm gần 100% thời gian của trình biên dịch là CompileSwift
giai đoạn Xcode chạy swiftc
lệnh trên tất cả các tệp Swift của mục tiêu của bạn.
Tôi đã thực hiện một số điều tra thêm và nếu tôi chỉ giữ đại biểu ứng dụng với bộ điều khiển mặc định thì quá trình biên dịch rất nhanh, nhưng khi tôi thêm ngày càng nhiều tệp dự án của mình, thời gian biên dịch bắt đầu rất chậm.
Bây giờ chỉ với 65 tệp nguồn, phải mất khoảng 8/10 giây để biên dịch mỗi lần. Không nhanh lắm đâu .
Tôi chưa thấy bài đăng nào nói về vấn đề này ngoại trừ bài này , nhưng đây là phiên bản cũ của Xcode 6. Vì vậy, tôi tự hỏi liệu tôi có phải là người duy nhất trong trường hợp đó không.
CẬP NHẬT
Tôi đã kiểm tra một vài dự án Swift trên GitHub như Alamofire , Euler và CryptoSwift , nhưng không ai trong số họ có đủ tệp Swift để thực sự so sánh. Dự án duy nhất tôi thấy bắt đầu có kích thước khá là SwiftHN và mặc dù chỉ có một tá tệp nguồn, tôi vẫn có thể xác minh điều tương tự, một không gian đơn giản và toàn bộ dự án cần biên dịch lại bắt đầu thực hiện thời gian ít (2/3 giây).
So với mã Objective-C nơi cả bộ phân tích và biên dịch đều phát sáng nhanh, điều này thực sự có cảm giác như Swift sẽ không bao giờ có thể xử lý các dự án lớn, nhưng xin vui lòng cho tôi biết tôi đã sai.
CẬP NHẬT Với Xcode 6 Beta 7
Vẫn không có cải thiện gì. Điều này đang bắt đầu trở nên vô lý. Với việc thiếu #import
Swift, tôi thực sự không thấy Apple sẽ có thể tối ưu hóa điều này như thế nào.
CẬP NHẬT Với Xcode 6.3 và Swift 1.2
Apple đã thêm các bản dựng gia tăng (và nhiều tối ưu hóa trình biên dịch khác). Bạn phải di chuyển mã của mình sang Swift 1.2 để thấy những lợi ích đó, nhưng Apple đã thêm một công cụ trong Xcode 6.3 để giúp bạn làm như vậy:
TUY NHIÊN
Đừng vui mừng quá nhanh như tôi đã làm. Trình giải đồ thị mà họ sử dụng để làm cho bản dựng gia tăng chưa được tối ưu hóa tốt.
Thật vậy, trước tiên, nó không xem xét các thay đổi chữ ký hàm, vì vậy nếu bạn thêm một khoảng trắng trong khối của một phương thức, tất cả các tệp tùy thuộc vào lớp đó sẽ được biên dịch lại.
Thứ hai, nó dường như tạo cây dựa trên các tệp được biên dịch lại ngay cả khi thay đổi không ảnh hưởng đến chúng. Ví dụ, nếu bạn di chuyển ba lớp này vào các tệp khác nhau
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Bây giờ nếu bạn sửa đổi FileA
, trình biên dịch rõ ràng sẽ đánh dấu FileA
để được biên dịch lại. Nó cũng sẽ biên dịch lại FileB
(điều đó sẽ ổn dựa trên các thay đổi FileA
), nhưng cũng FileC
vì FileB
được biên dịch lại, và điều đó khá tệ vì FileC
không bao giờ sử dụng FileA
ở đây.
Vì vậy, tôi hy vọng họ cải thiện bộ giải cây phụ thuộc đó ... Tôi đã mở một radar với mã mẫu này.
CẬP NHẬT Với Xcode 7 beta 5 và Swift 2.0
Hôm qua Apple đã phát hành bản beta 5 và bên trong các ghi chú phát hành mà chúng ta có thể thấy:
Swift Language & Compiler • Các bản dựng tăng dần: chỉ thay đổi phần thân của hàm sẽ không còn khiến các tệp phụ thuộc được xây dựng lại. (15352929)
Tôi đã thử nó và tôi phải nói rằng nó đang hoạt động thực sự (thực sự!). Họ đã tối ưu hóa rất nhiều các bản dựng gia tăng nhanh chóng.
Tôi thực sự khuyên bạn nên tạo một swift2.0
nhánh và giữ cho mã của mình được cập nhật bằng XCode 7 beta 5. Bạn sẽ hài lòng bởi các cải tiến của trình biên dịch (tuy nhiên tôi muốn nói rằng trạng thái toàn cầu của XCode 7 vẫn chậm và lỗi)
CẬP NHẬT Với Xcode 8.2
Đã được một thời gian kể từ lần cập nhật cuối cùng của tôi về vấn đề này.
Ứng dụng của chúng tôi hiện có khoảng 20 nghìn dòng mã Swift gần như độc quyền, khá tốt nhưng không nổi bật. Nó đã trải qua swift 2 và hơn 3 di chuyển nhanh chóng. Phải mất khoảng 5 / 6m để biên dịch trên Macbook pro giữa năm 2014 (Intel Core i7 2,5 GHz), ổn trên bản dựng sạch.
Tuy nhiên, bản dựng gia tăng vẫn là một trò đùa mặc dù Apple tuyên bố rằng:
Xcode sẽ không xây dựng lại toàn bộ mục tiêu khi chỉ có những thay đổi nhỏ xảy ra. (28892485)
Rõ ràng tôi nghĩ rằng nhiều người trong chúng ta chỉ cười sau khi kiểm tra tài sản vô nghĩa này (thêm một tài sản riêng tư (riêng tư!) Vào bất kỳ tệp nào trong dự án của tôi sẽ biên dịch lại toàn bộ ...)
Tôi muốn chỉ cho các bạn biết chủ đề này trên các diễn đàn của nhà phát triển Apple có thêm một số thông tin về vấn đề này (cũng như đánh giá cao thông tin liên lạc của nhà phát triển Apple về vấn đề này một lần nữa)
Về cơ bản mọi người đã nghĩ ra một vài điều để cố gắng cải thiện việc xây dựng gia tăng:
- Thêm một
HEADER_MAP_USES_VFS
thiết lập dự án được đặt thànhtrue
- Vô hiệu hóa
Find implicit dependencies
từ chương trình của bạn - Tạo một dự án mới và di chuyển hệ thống phân cấp tệp của bạn sang dự án mới.
Tôi sẽ thử giải pháp 3 nhưng giải pháp 1/2 không hiệu quả với chúng tôi.
Điều đáng buồn cười trong toàn bộ tình huống này là khi nhìn vào bài đăng đầu tiên về vấn đề này, chúng tôi đã sử dụng Xcode 6 với mã tin swift 1 hoặc swift 1.1 khi chúng tôi đạt được sự chậm chạp trong quá trình biên dịch đầu tiên và bây giờ khoảng hai năm sau mặc dù đã có những cải tiến thực sự từ Apple tình hình cũng tệ như với Xcode 6. Thật mỉa mai.
Tôi thực sự hối tiếc vì đã chọn Swift trên Obj / C cho dự án của chúng tôi vì sự thất vọng hàng ngày mà nó liên quan. (Tôi thậm chí chuyển sang AppCode nhưng đó là một câu chuyện khác)
Dù sao tôi thấy bài đăng SO này có 32k lượt xem và 143 lượt viết khi viết bài này nên tôi đoán tôi không phải là người duy nhất. Các bạn ơi, mặc dù có bi quan về tình huống này, có thể có một chút ánh sáng ở cuối đường hầm.
Nếu bạn có thời gian (và can đảm!) Tôi đoán Apple hoan nghênh radar về điều này.
Đến lần sau! Chúc mừng
CẬP NHẬT Với Xcode 9
Tình cờ gặp điều này ngày hôm nay. Xcode lặng lẽ giới thiệu một hệ thống xây dựng mới để cải thiện hiệu suất khủng khiếp hiện tại. Bạn phải kích hoạt nó thông qua các cài đặt không gian làm việc.
Đã thử chưa nhưng sẽ cập nhật bài này sau khi hoàn thành. Có vẻ đầy hứa hẹn mặc dù.