ฉันใช้ Xcode 6 Beta 6
นี่เป็นบางสิ่งบางอย่างที่ดักฟังฉันมาระยะหนึ่งแล้ว แต่มันมาถึงจุดที่ใช้งานได้แทบจะไม่แล้วในตอนนี้
โครงการของฉันเริ่มที่จะมีดีขนาด 65 ไฟล์อย่างรวดเร็วและไม่กี่สะพานไฟล์ Objective-C (ซึ่งจริงๆไม่ได้เป็นสาเหตุของปัญหา)
ดูเหมือนว่าการดัดแปลงเล็กน้อยสำหรับไฟล์ Swift ใด ๆ (เช่นการเพิ่มพื้นที่สีขาวแบบง่าย ๆ ในคลาสที่แทบจะไม่เคยใช้ในแอพ) จะทำให้ไฟล์ Swift ทั้งหมดสำหรับเป้าหมายที่ระบุได้รับการคอมไพล์ใหม่
หลังจากการตรวจสอบที่ลึกกว่านี้ฉันพบว่าสิ่งที่ใช้เวลาในการรวบรวม 100% นั้นเป็นCompileSwift
ขั้นตอนที่ Xcode ใช้swiftc
คำสั่งในไฟล์ Swift ทั้งหมดของเป้าหมายของคุณ
ฉันทำการตรวจสอบเพิ่มเติมและถ้าฉันเก็บตัวแทนแอพไว้ด้วยคอนโทรลเลอร์เริ่มต้นเท่านั้นการคอมไพล์นั้นเร็วมาก แต่เมื่อฉันเพิ่มไฟล์โครงการของฉันมากขึ้นเรื่อย ๆ เวลาในการคอมไพล์ก็เริ่มช้าลงจริง ๆ
ขณะนี้มีไฟล์ต้นฉบับเพียง 65 ไฟล์จึงใช้เวลารวบรวมประมาณ 8/10 วินาทีในแต่ละครั้ง ไม่เร็วมากเลย
ฉันไม่ได้เห็นโพสต์พูดคุยเกี่ยวกับปัญหานี้ยกเว้นคนนี้แต่มันเป็นรุ่นเก่า Xcode 6. ดังนั้นฉันสงสัยว่าถ้าผมเป็นเพียงหนึ่งในกรณีที่
UPDATE
ฉันได้ตรวจสอบโครงการ Swift สองสามรายการบนGitHubเช่นAlamofire , EulerและCryptoSwiftแต่ไม่มีโครงการใดที่มีไฟล์ Swift เพียงพอที่จะเปรียบเทียบได้จริง โครงการเดียวที่ฉันพบว่าเริ่มต้นมีขนาดที่เหมาะสมคือSwiftHNและถึงแม้ว่าจะมีไฟล์ต้นฉบับเพียงโหลเท่านั้นที่ฉันยังสามารถตรวจสอบสิ่งเดียวกันได้พื้นที่เดียวที่เรียบง่ายและโครงการทั้งหมดต้องการการคอมไพล์ใหม่ซึ่งเริ่มใช้ เวลาเล็กน้อย (2/3 วินาที)
เมื่อเปรียบเทียบกับรหัส Objective-C ที่ทั้งตัววิเคราะห์และการคอมไพล์กำลังสว่างอย่างรวดเร็วนี้รู้สึกว่า Swift จะไม่สามารถจัดการโครงการขนาดใหญ่ได้ แต่โปรดบอกฉันว่าฉันผิด
อัปเดตด้วย Xcode 6 Beta 7
ยังไม่มีการปรับปรุงใด ๆ นี่เป็นการเริ่มที่จะไร้สาระ ด้วยการขาด#import
ใน Swift ฉันไม่เห็นจริง ๆ ว่า Apple จะสามารถเพิ่มประสิทธิภาพนี้ได้อย่างไร
อัปเดตด้วย 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 beta 5 และ Swift 2.0
เมื่อวานนี้ Apple เปิดตัวเบต้า 5 และภายในบันทึกประจำรุ่นที่เราได้เห็น:
Swift Language & Compiler •การต่อเติมที่เพิ่มขึ้น: การเปลี่ยนเฉพาะส่วนของฟังก์ชั่นไม่ควรทำให้ไฟล์ที่ต้องพึ่งพาถูกสร้างใหม่อีกต่อไป (15352929)
ฉันได้ลองแล้วและฉันต้องบอกว่ามันใช้งานได้จริง (จริง ๆ !) ตอนนี้ พวกเขาปรับการสร้างที่เพิ่มขึ้นอย่างรวดเร็ว
ฉันขอแนะนำให้คุณสร้างswift2.0
สาขาและทำให้รหัสของคุณทันสมัยโดยใช้ XCode 7 เบต้า 5 คุณจะพอใจกับการปรับปรุงคอมไพเลอร์
อัพเดทด้วย Xcode 8.2
เป็นเวลานานแล้วตั้งแต่การอัพเดทครั้งล่าสุดของฉันเกี่ยวกับปัญหานี้
ตอนนี้แอพของเรามีโค้ด Swift เกือบ 20 บรรทัดเกือบสมบูรณ์แล้ว แต่ไม่ได้โดดเด่น มันเปลี่ยนไปอย่างรวดเร็ว 2 และมากกว่าการโยกย้าย 3 อย่างรวดเร็ว ใช้เวลาประมาณ 5 / 6m ในการคอมไพล์ในกลางปี 2014 Macbook pro (2.5 GHz Intel Core i7) ซึ่งไม่เป็นปัญหาสำหรับโครงสร้างที่สะอาด
อย่างไรก็ตามการสร้างที่เพิ่มขึ้นยังคงเป็นเรื่องตลกแม้ Apple จะอ้างว่า:
Xcode จะไม่สร้างเป้าหมายใหม่ทั้งหมดเมื่อมีการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้นที่เกิดขึ้น (28892475)
เห็นได้ชัดว่าฉันคิดว่าพวกเราหลายคนเพิ่งหัวเราะหลังจากตรวจสอบเรื่องไร้สาระนี้ (เพิ่มหนึ่งส่วนตัว (ส่วนตัว!) คุณสมบัติในไฟล์ใด ๆ ของโครงการของฉันจะคอมไพล์ทั้งสิ่ง ... )
ฉันต้องการจะชี้ให้คุณไปที่หัวข้อนี้ในฟอรัมนักพัฒนาของ Apple ซึ่งมีข้อมูลเพิ่มเติมเกี่ยวกับปัญหา (รวมทั้งชื่นชมการสื่อสารของ Apple dev ในเรื่องนี้เป็นระยะ ๆ )
โดยทั่วไปผู้คนจะคิดขึ้นมาสองสามสิ่งเพื่อพยายามปรับปรุงการสร้างที่เพิ่มขึ้น:
- เพิ่มการ
HEADER_MAP_USES_VFS
ตั้งค่าโครงการเป็นtrue
- ปิดใช้งาน
Find implicit dependencies
จากโครงร่างของคุณ - สร้างโครงการใหม่และย้ายลำดับชั้นไฟล์ของคุณไปยังโครงการใหม่
ฉันจะลองโซลูชันที่ 3 แต่วิธีที่ 1/2 ไม่ได้ผลสำหรับเรา
สิ่งที่แดกดันในสถานการณ์ทั้งหมดนี้คือการดูโพสต์แรกในปัญหานี้เราใช้ Xcode 6 ด้วยฉันเชื่อว่ารหัส swift 1 หรือ swift 1.1 เมื่อเรามาถึงการรวบรวมความซบเซาแรกและตอนนี้ประมาณสองปีต่อมาแม้จะมีการปรับปรุงจริงจาก Apple สถานการณ์เลวร้ายอย่างที่เคยเป็นกับ Xcode 6 วิธีที่น่าขัน
ที่จริงผมจริงๆเสียใจเลือกสวิฟท์กว่า Obj / C สำหรับโครงการของเราเพราะแห้วทุกวันมันเกี่ยวข้องกับ (ฉันยังเปลี่ยนเป็น AppCode แต่เป็นอีกเรื่องหนึ่ง)
อย่างไรก็ตามฉันเห็นว่าโพสต์นี้มีจำนวนการดู 32k + และ 143 ครั้งจากการเขียนนี้ดังนั้นฉันเดาว่าฉันไม่ใช่คนเดียว แม้ว่าพวกเขาจะมองโลกในแง่ร้ายเกี่ยวกับสถานการณ์นี้อาจมีแสงสว่างในตอนท้ายของอุโมงค์
หากคุณมีเวลา (และความกล้าหาญ!) ฉันเดาว่า Apple ยินดีต้อนรับเรดาร์เกี่ยวกับเรื่องนี้
ครั้งต่อไป! ไชโย
อัปเดตด้วย Xcode 9
สะดุดเมื่อนี้ในวันนี้ Xcode เปิดตัวระบบสร้างใหม่อย่างเงียบ ๆ เพื่อปรับปรุงประสิทธิภาพการทำงานอันยิ่งใหญ่ในปัจจุบัน คุณต้องเปิดใช้งานผ่านการตั้งค่าพื้นที่ทำงาน
ได้ลองแล้ว แต่จะอัปเดตโพสต์นี้หลังจากเสร็จสิ้น ดูเหมือนว่าจะมีแนวโน้ม