मैं Xcode 6 बीटा 6 का उपयोग कर रहा हूं।
यह कुछ ऐसा है जो मुझे पिछले कुछ समय से परेशान कर रहा है, लेकिन यह उस बिंदु पर पहुंच रहा है जहां अब यह मुश्किल से उपयोग योग्य है।
मेरी परियोजना में 65 स्विफ्ट फ़ाइलों और कुछ ब्रिजित ऑब्जेक्टिव-सी फ़ाइलों का एक सभ्य आकार होना शुरू हो रहा है (जो वास्तव में समस्या का कारण नहीं हैं)।
यह किसी भी स्विफ्ट फ़ाइल के लिए किसी भी मामूली संशोधन की तरह लगता है (जैसे कि क्लास में एक साधारण सफेद स्थान जोड़ना जो कि ऐप में मुश्किल से उपयोग किया जाता है) पूरे स्विफ्ट फ़ाइलों को फिर से निर्दिष्ट करने के लिए प्रेरित करेगा।
एक गहरी जांच के बाद, मैंने पाया है कि संकलक समय का 100% हिस्सा क्या ले रहा है, वह CompileSwift
चरण है जहां Xcode swiftc
आपके लक्ष्य की सभी स्विफ्ट फ़ाइलों पर कमांड चलाता है ।
मैंने कुछ और जांच की, और अगर मैं केवल एक डिफ़ॉल्ट नियंत्रक के साथ एप्लिकेशन प्रतिनिधि को रखता हूं, तो संकलन बहुत तेज है, लेकिन जैसा कि मैं अपनी परियोजना फाइलों में अधिक से अधिक जोड़ रहा था, संकलन समय वास्तव में धीमा होने लगा था।
अब केवल 65 स्रोत फ़ाइलों के साथ, हर बार संकलित करने में लगभग 8/10 सेकंड लगते हैं। बहुत तेज नहीं है ।
मैं किसी भी पद को छोड़कर इस मुद्दे के बारे में बात नहीं देखा है इस एक है, लेकिन तो मैं सोच रहा हूँ अगर मैं केवल उस मामले में एक हूँ यह Xcode 6. के एक पुराने संस्करण था।
अपडेट करें
मैंने GitHub पर Alamofire , Euler और CryptoSwift जैसी कुछ Swift परियोजनाओं की जाँच की है , लेकिन उनमें से किसी के पास वास्तव में तुलना करने के लिए पर्याप्त Swift फाइलें नहीं थीं। एकमात्र परियोजना जो मैंने पाया कि एक सभ्य आकार शुरू हो रहा था स्विफ्टएचएन था , और भले ही इसके पास केवल एक दर्जन स्रोत फाइलें थीं, मैं अभी भी एक ही चीज़ को सत्यापित करने में सक्षम था, एक साधारण स्थान और पूरे प्रोजेक्ट को पुनर्संयोजन की आवश्यकता थी जो एक को लेना शुरू कर रहा था थोड़ा समय (2/3 सेकंड)।
ऑब्जेक्टिव-सी कोड की तुलना में जहां विश्लेषक और संकलन दोनों तेजी से धधक रहे हैं, यह वास्तव में ऐसा लगता है कि स्विफ्ट कभी भी बड़ी परियोजनाओं को संभालने में सक्षम नहीं होगा, लेकिन कृपया मुझे बताएं कि मैं गलत हूं।
एक्सकोड 6 बीटा 7 के साथ अद्यतन
फिर भी कोई सुधार नहीं हुआ। यह हास्यास्पद होने लगा है। की कमी के साथ#import
स्विफ्ट , मैं वास्तव में यह नहीं देखता कि एप्पल कभी भी इसे कैसे अनुकूलित कर पाएगा।
एक्सकोड 6.3 और स्विफ्ट 1.2 के साथ अपडेट करें
Apple ने वृद्धिशील बिल्ड (और कई अन्य संकलक अनुकूलन) जोड़े हैं । आपको उन लाभों को देखने के लिए स्विफ्ट 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
से पुन: संकलित होने के लिए चिह्नित करेगा । यह भी recompile होगा FileB
(जो कि परिवर्तनों के आधार पर ठीक होगा FileA
), लेकिन यह भी FileC
क्योंकि FileB
recompiled है, और यह बहुत बुरा है क्योंकि यहाँ FileC
कभी उपयोग नहीं होता FileA
है।
इसलिए मुझे आशा है कि वे उस निर्भरता के पेड़ के तलवे में सुधार करेंगे ... मैंने इस नमूना कोड के साथ एक रडार खोला है ।
Xcode 7 बीटा 5 और स्विफ्ट 2.0 के साथ अद्यतन
कल Apple ने बीटा 5 जारी किया और रिलीज़ नोटों के अंदर हम देख सकते हैं:
स्विफ्ट लैंग्वेज एंड कंपाइलर • इंक्रीमेंटल बिल्ड: केवल एक फंक्शन की बॉडी बदलने से डिपेंडेंट फाइल्स को फिर से नहीं बनाना चाहिए। (15352929)
मैंने इसे एक कोशिश दी है और मुझे यह कहना चाहिए कि यह अब वास्तव में (वास्तव में!) काम कर रहा है। वे काफी तेजी से वृद्धिशील बिल्ड को अनुकूलित करते हैं।
मैं आपको एक swift2.0
शाखा बनाने और अपने कोड को XCode 7 बीटा 5 का उपयोग करने की तारीख तक रखने की सलाह देता हूं । आप संकलक के संवर्द्धन से प्रसन्न होंगे (हालांकि मैं कहूंगा कि XCode 7 की वैश्विक स्थिति अभी भी धीमी और छोटी है)
एक्सकोड 8.2 के साथ अद्यतन
इस मुद्दे पर मेरे अंतिम अपडेट के बाद से कुछ समय हो गया है इसलिए यहां यह है।
हमारा ऐप अब लगभग विशेष रूप से स्विफ्ट कोड की 20k लाइनों के बारे में है, जो सभ्य है, लेकिन उत्कृष्ट नहीं है। यह स्विफ्ट 2 और स्विफ्ट 3 माइग्रेशन से कम हुआ। 2014 के मैकबुक प्रो (2.5 गीगाहर्ट्ज इंटेल कोर i7) पर संकलन करने के लिए लगभग 5/6 मी का समय लगता है जो एक साफ बिल्ड पर ठीक है।
हालाँकि वृद्धिशील निर्माण Apple का दावा करने के बावजूद अभी भी एक मजाक है:
केवल छोटे परिवर्तन होने पर Xcode पूरे लक्ष्य का पुनर्निर्माण नहीं करेगा। (28892475)
जाहिर है मुझे लगता है कि हममें से कई लोग इस बकवास की जाँच करने के बाद हँसे (एक निजी (निजी!) संपत्ति को मेरी परियोजना की किसी भी फ़ाइल में जोड़कर पूरी बात को फिर से जोड़ दिया जाएगा ...)
मैं आप लोगों को Apple डेवलपर मंचों पर इस धागे की ओर संकेत करना चाहता हूं जिसमें इस मुद्दे के बारे में कुछ और जानकारी है (साथ ही इस मामले में Apple देव संचार की एक बार में सराहना की गई है)
मूल रूप से लोग वृद्धिशील निर्माण में सुधार करने के लिए कुछ चीजें लेकर आए हैं:
HEADER_MAP_USES_VFS
सेट करने के लिए एक प्रोजेक्ट सेटिंग जोड़ेंtrue
Find implicit dependencies
अपनी योजना से अक्षम करें- एक नया प्रोजेक्ट बनाएं और अपनी फ़ाइलों को पदानुक्रम को नए पर ले जाएं।
मैं 3 समाधान की कोशिश करूंगा, लेकिन समाधान 1/2 हमारे लिए काम नहीं किया।
इस पूरी स्थिति में विडंबना यह है कि इस मुद्दे पर पहली पोस्ट को देखकर हम Xcode 6 का उपयोग कर रहे थे, जिसके बारे में मेरा मानना है कि स्विफ्ट 1 या स्विफ्ट 1.1 कोड तब था जब हम पहले संकलन की सुस्ती तक पहुँच गए थे और अब लगभग दो साल बाद Apple के वास्तविक सुधारों के बावजूद। स्थिति बस के रूप में Xcode 6 के साथ के रूप में बुरा है। कितना विडंबना है।
मैं वास्तव में वास्तव में हमारी परियोजना के लिए Obj / C पर स्विफ्ट चुनने के लिए पछतावा करता क्योंकि इसमें दैनिक हताशा शामिल है। (मैं AppCode पर भी स्विच करता हूं लेकिन यह एक और कहानी है)
वैसे भी मैं इस SO पोस्ट को 32k + व्यूज और 143 अप इस लेखन के रूप में देखता हूं इसलिए मुझे लगता है कि मैं अकेला नहीं हूं। इस स्थिति पर निराशावादी होने के बावजूद लोगों को लटकाएं सुरंग के अंत में कुछ प्रकाश हो सकता है।
यदि आपके पास समय (और साहस!) है तो मुझे लगता है कि Apple इस बारे में रडार का स्वागत करता है।
अगली बार तिल! चियर्स
एक्सकोड 9 के साथ अद्यतन
इस पर ठोकर आज। Xcode चुपचाप वर्तमान भयानक प्रदर्शन पर सुधार करने के लिए एक नया निर्माण प्रणाली शुरू की। आपको इसे कार्यक्षेत्र सेटिंग्स के माध्यम से सक्षम करना होगा।
अभी तक एक कोशिश दे चुके हैं, लेकिन इस पोस्ट को पूरा करने के बाद इसे अपडेट करेंगे। हालांकि होनहार लग रहा है।