Xcode 6 स्विफ्ट सुपर स्लो टाइपिंग और ऑटोोकम्पिशन के साथ


114

यह सिर्फ मुझे या Xcode 6 (6.0.1) स्विफ्ट के साथ हो रहा है है सुपर धीमी गति से जब आप विशेष रूप से स्वतः पूर्ण के साथ, अपने कोड लिखें?

एक सामान्य ऑब्जेक्टिव-सी क्लास, भले ही स्विफ्ट प्रोजेक्ट के अंदर हो, लगभग पहले की तरह ही काम करती है, इसलिए यह स्विफ्ट है जो इसे मार देती है।

किसी और को भी उसी असुविधा का अनुभव होता है? क्या आपके पास प्रदर्शन में सुधार करने का कोई विचार है?

  • मैंने कुछ सेटिंग्स के साथ खेलने की कोशिश की लेकिन कोई किस्मत नहीं।
  • मैं भी बिना किसी भाग्य के Xcode और कंप्यूटर को पुनरारंभ करने की कोशिश कर रहा हूं।
  • कोई अन्य भारी ऐप नहीं खुला है।

मैं 8 जीबी रैम और एसएसडी एचडी के साथ एक मिड 2009 मैकबुक प्रो (2.26 गीगाहर्ट्ज इंटेल कोर 2 डुओ) का उपयोग करता हूं, जो बिल्कुल भी नई बात नहीं है, लेकिन अभी भी पूरी तरह से जंक नहीं है।

यह एक शर्म की बात है कि मैं स्विफ्ट का उपयोग शुरू करने के लिए उत्साहित था और यह अब वास्तव में असहनीय है।

विचार / टिप्स?


1
मैं तुम्हारे जैसे ही मुद्दों पर चल रहा हूँ। अक्सर Xcode मुझसे कहता है "
SourceKit

हाँ, यह भी एक और समस्या है, मुझे यकीन नहीं है कि वे हालांकि संबंधित हैं। जब यह त्रुटि हो रही थी तब भी यह धीमी थी।
mllm

1
मुझे यकीन है कि वे संबंधित हैं। बीटा 5 में मैंने उस संदेश को और भी अधिक बार देखा, और मैंने देखा कि कभी भी जब सुझाव काम नहीं करता था। (जब मैंने कुछ चरों को टाइप किया और सुझाव देने के लिए Esc दबाया)
idmean

1
मेरी भी यही समस्या है। मेरा XCode CPU के 300% + का उपयोग करता है और मेरी मैकबुक रेटिना को एक घोंघे की गति तक धीमा कर देता है। मैं इस दिन बहुत अधिक आँख बंद करके टाइप करता हूं और एक्सकोड के पूरा होने का इंतजार करता हूं।
पुखर

1
2011 के 15.6 के उत्तरार्ध में मैकबुक प्रो के साथ समान समस्याएं हैं। 8 जीबी रैम और एसएसडी के साथ मैकबुक प्रो। 90% समय कोड पूरा होने पर एक्सकोड को फ्रीज कर देता है, जब मैं गतिविधि मॉनिटर की जांच करता हूं तो मुझे ~ 200% सीपीयू का उपयोग दिखाई देता है। कुछ सेकंड के बाद फ्रीज हो जाता है। कुछ मिनट के लिए।
isair

जवाबों:


86
  • Xcode से बाहर निकलें और मैक को रीस्टार्ट करें लेकिन जरूरी नहीं है।
  • फ़ोल्डर की सामग्री को हटा दें ~ / लाइब्रेरी / डेवलपर / Xcode / DerivedData
  • सामग्री हटाएं ~ / लाइब्रेरी / कैश / com.apple.dt.Xcode

यह एक अस्थायी समाधान है, लेकिन बहुत काम करता है।

स्क्रिप्ट एडिटर ऐप का उपयोग करके स्क्रिप्ट के नीचे।

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कमांड लाइन पर हर बार उन दो फ़ोल्डरों को साफ़ करना चाहेंगे।


ठीक है, हालांकि यह बिल्कुल सही नहीं है, लेकिन ऐसा लगता है कि यह आपके समाधान में काफी सुधार करता है। मुझे लगने वाला है कि निशान को सुलझाना है, क्योंकि काफी लंबे समय के बाद यह संभवत: सबसे अच्छा है। दूसरों के बारे में सुनकर खुशी होगी ... बहुत बहुत धन्यवाद!
mllm

उन दो फ़ोल्डरों से सभी सामग्री को हटाने के लिए मेरे लैपटॉप को लगभग एक मिनट लगा। Xcode पर इंडेक्सिंग में अब 30 सेकंड लगते हैं।
एनको अलोंसो

इसने मेरी टाइपिंग और स्वतः पूर्णता को तेज़ नहीं बनाया, लेकिन इससे मुझे अपने मैक से काफी अधिक जगह खाली करने में मदद मिली।
स्कॉट झू

इस जवाब ने स्वतः पूर्ण चीज़, stackoverflow.com/a/29849869/1213267
स्कॉट झू

13

मैंने कुछ "सरल" कोड टाइप करते हुए 100% + सीपीयू का भी अनुभव किया। जिस तरह से आप अपने कोड संरचना से तेज-पार्सर तेज बनाने के लिए कुछ छोटे गुर।

स्ट्रिंग्स में "+" कंसीलेटर का उपयोग न करें। मेरे लिए यह बहुत जल्दी धीमेपन को ट्रिगर करता है। प्रत्येक नया "+" पार्सर को क्रॉल में लाता है, और आपको हर बार अपने फ़ंक्शन बॉडी में कहीं न कहीं एक नया चार्ट जोड़ने के लिए कोड को फिर से लिखना पड़ता है।

के बजाय:

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

टेम्प्लेट-सिंटैक्स का उपयोग करें जो स्विफ्ट में पार्स करने के लिए अधिक कुशल लगता है:

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

इस तरह से मैं मूल रूप से इनलाइन वर्जन "\ (*)" के साथ स्ट्रलेन में कोई सीमा नहीं देखता हूं।

यदि आपके पास गणना है, जो + / * का उपयोग करते हैं, तो उन्हें छोटे भागों में विभाजित करें।

के बजाय:

var result = pi * 2 * radius 

उपयोग:

var result  = pi * 2
    result *= radius

यह कम कुशल लग सकता है, लेकिन स्विफ्ट पार्सर इस तरह से बहुत तेज है। कुछ सूत्र संकलित नहीं करेंगे, यदि उनके पास कई ऑपरेशन हैं, भले ही वे गणितीय रूप से सही हों।

यदि आपके पास कुछ जटिल गणनाएं हैं, तो इसे एक दुर्गंध में डालें। इस तरह से पार्सर इसे एक बार पार्स कर सकता है और आपको इसे अपने फ़ंक्शन बॉडी में कुछ बदलने के लिए हर बार वापस नहीं करना पड़ता है।

क्योंकि यदि आपके फ़ंक्शन बॉडी में गणना है तो किसी भी तरह से स्विफ्ट पार्सर हर बार इसकी जांच करता है यदि प्रकार, वाक्यविन्यास आदि अभी भी सही हैं। यदि कोई रेखा गणना से ऊपर बदलती है, तो हो सकता है कि आपकी गणना / सूत्र के अंदर कुछ संस्करण बदल गए हों। यदि आप इसे किसी बाहरी फ़ंक्शन में रखते हैं, तो इसे एक बार मान्य किया जाएगा और स्विफ्ट खुश है कि यह सही होगा और इसे लगातार रिपेयर नहीं करता है, जो उच्च सीपीयू उपयोग का कारण बन रहा है।

इस प्रकार मैं टाइप करते समय प्रत्येक सीपीयू पर 100% से लेकर निम्न सीपीयू तक प्राप्त करता था। उदाहरण के लिए यह 3 पंक्तियाँ आपके फ़ंक्शन बॉडी में इनलाइन डालती हैं और स्विफ्टपसर को क्रॉल में ला सकती हैं।

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 )

लेकिन अगर मैं इसे एक फंक में डाल देता हूं और बाद में कॉल करता हूं, तो स्विफ्टपेयर बहुत तेज है

// 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) 
}

स्विफ्ट और XCode 6.1 अभी भी बहुत छोटी है, लेकिन अगर आप इन सरल ट्रिक्स का पालन करते हैं, तो संपादन कोड फिर से स्वीकार्य हो जाता है। मैं बहुत तेज स्विफ्ट पसंद करता हूं, क्योंकि यह .h फ़ाइलों से छुटकारा पा लेता है और बहुत क्लीनर सिंटैक्स का उपयोग करता है। अभी भी कई प्रकार की कास्टिंग की आवश्यकता है जैसे "myVar as AnyObject", लेकिन जटिल उद्देश्य-सी परियोजना संरचना और वाक्यविन्यास की तुलना में छोटी बुराई है।

इसके अलावा एक और अनुभव, मैंने स्प्रिटकिट की कोशिश की, जो उपयोग करने में मजेदार है, लेकिन इसकी काफी कुशल है यदि आपको 60fps पर निरंतर प्रतिनिधि की आवश्यकता नहीं है। यदि आपके "स्प्राइट्स" अक्सर बदलते नहीं हैं तो पुराने कैलेयर्स का उपयोग सीपीयू के लिए बेहतर है। यदि आप परतों के .contents को नहीं बदलते हैं, तो CPU मूल रूप से निष्क्रिय है, लेकिन यदि आपके पास एक SpriteKit ऐप है जो पृष्ठभूमि में चल रही है, तो अन्य ऐप्स में वीडियोप्लेबैक शायद ही 60fps अपडेट-लूप के कारण हकलाना शुरू कर सकता है।

कभी-कभी एक्सकोड संकलन करते समय अजीब त्रुटियों को दिखाता है, फिर यह मेनू "उत्पाद> क्लीन" में जाने में मदद करता है और इसे फिर से संकलित करता है, यह कैश का एक छोटी गाड़ी कार्यान्वयन लगता है।

पार्सिंग में सुधार करने का एक और शानदार तरीका जब xcode आपके कोड के साथ अटक जाता है तो यहां एक अन्य स्टैकओवरफ़्लो पोस्ट में उल्लेख किया गया है । मूल रूप से आप अपनी .swift फ़ाइल से सभी सामग्री को बाहरी संपादक में कॉपी करते हैं, और फिर फ़ंक्शन द्वारा फ़ंक्शन इसे वापस कॉपी करते हैं और देखते हैं कि आपकी अड़चन कहां है। यह वास्तव में मेरी परियोजना को 100% CPU के साथ पागल हो जाने के बाद, मुझे फिर से एक उचित गति प्राप्त करने में मदद करता है। अपने कोड को वापस कॉपी करते समय, आप इसे रीफ़ैक्टर कर सकते हैं और अपने फ़ंक्शन-निकायों को छोटा और फ़ंक्शंस / फ़ॉर्म्यूलर / भाव सरल (या कई लाइनों में विभाजित) रखने की कोशिश कर सकते हैं।


बहुत गहन उत्तर। हो सकता है कि कुछ सुझाव "प्राथमिक चिकित्सा" के रूप में महान हों, लेकिन वास्तव में, हमें उम्मीद नहीं है कि Xcode बस एक बड़ी परेशानी से गुजरने के बिना काम करेगा?
mllm

1
दुर्भाग्य से xcode 6.1 + स्विफ्ट काफी अस्थिर है, इसलिए इन "हैक्स" की आवश्यकता है। ऐप्पल को स्विफ्ट और एक्सकोड को ठीक करना चाहिए। लेकिन प्रोग्राम के साथ स्विफ्ट बहुत अच्छा है, इसलिए शॉर्ट-टर्म में यह सीपीयू-यूसेज को बे पर रखने का एकमात्र तरीका है।
डैनियल अन्टर्बर्जर

मैंने उन सभी संभावित बदलावों का प्रस्ताव किया जो आप प्रस्तावित करते हैं लेकिन दुर्भाग्य से मेरा ऑटोकंप्लीशन अभी भी बेकार है। मुझे संदेह है कि यदि क्लॉज भी परेशानी पैदा कर सकता है। क्या कोई भी इस बात को स्वीकार कर सकता है? मेरा मतलब है वापसी (ए = बी)? x: y
इल्केर बाल्टकी

खैर, आईडीई को खुश करने के लिए एक निश्चित तरीके से कोड लिखना एक वास्तविक बकवास है
एंड्री गोर्डीव

10

स्वत: पूर्ण Xcode 4 के बाद से टूट गया है। जब तक कि Apple इस 2 साल पुराने बग को ठीक करने का निर्णय नहीं लेता है, एकमात्र समाधान, दुर्भाग्य से, कोड पूरा करने के लिए XCode की प्राथमिकताओं को बंद करना है (नीचे दी गई तस्वीर का पहला विकल्प)।

आप मैन्युअल रूप से CTRL spaceया ESCजब आपको इसकी आवश्यकता हो, तब तक पूरा करना जारी रख सकते हैं ।

यह एकमात्र समाधान है जो हर बार 100% मामलों में काम करता है।

यहां छवि विवरण दर्ज करें

एक और बात जो मैंने हाल ही में खोजी है वह यह है: यदि आप Xcode पर प्लगइन्स का उपयोग करते हैं, तो नहीं। उन सबको हटाओ। वे समस्या को बदतर बनाते हैं।


5

क्या आप Spotify का उपयोग कर रहे हैं? मैंने 2009 में एक iMac मिड (2.66Ghz) पर Xcode 6.1 GM के साथ Yosemite GM को स्थापित किया था। मुझे लगता है कि "SpotifyWebHelper" नामक एक प्रक्रिया को हमेशा प्रतिक्रिया न करने के रूप में लाल चिह्नित किया जाता है, इसलिए मैंने विकल्प को अक्षम कर दिया "वेब से प्रारंभ"। Spotify और अब Xcode काफी बेहतर तरीके से चलने लगता है।


दिलचस्प है, लेकिन मेरे लिए यह संबंधित नहीं है Spotify ... यह हालांकि दिखाता है कि यह सिर्फ एक "सामान्य" प्रदर्शन मुद्दा है - जिसका अर्थ है - अधिक संसाधन स्पष्ट करें और यह बेहतर काम करेगा। यह दुखद है कि मुझे अब और संसाधन नहीं मिले हैं (एक नए मैक पर पैसे के अलावा)।
mllm

2

मुझे पता चला कि आमतौर पर तब होता है जब आप:

  • एक ही कथन में लंबे भाव हैं ( यह उत्तर देखें )
  • एक ही अभिव्यक्ति में कई कस्टम ऑपरेटरों को मिलाएं

2 का मामला नवीनतम एक्सकोड रिलीज में से एक में तय किया गया लगता है। उदाहरण: मैंने 2 कस्टम ऑपरेटरों को परिभाषित किया <और&> और <||>, और जैसे अभिव्यक्ति में उपयोग किया गया a <&&> b <&&> c <||> d। कई लाइनों में विभाजित होने से समस्या हल हो गई:

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

मुझे आशा है कि आपके मामले ऊपर के 2 में से एक द्वारा कवर किए गए हैं ... कृपया या तो एक टिप्पणी पोस्ट करें


5
दुर्भाग्य से यह भी एक ब्रांड के नए स्वच्छ प्रोजेक्ट में होता है जिसमें कुछ भी नहीं है और "var s: Stri ..." के रूप में कुछ सरल टाइप करने के साथ। जैसे ही मैंने सेंट लिखना शुरू किया ... पूरा होने के सुझावों को देखते हुए यह सुस्त हो जाएगा।
mllm

यह निश्चित रूप से मेरे लिए ऑपरेंड है। एक ही लाइन में एक से अधिक ऑपरेंड होने से इसका कारण बनता है। जवाब के लिए धन्यवाद। यह सही उत्तर होना चाहिए
केसवा

2

Xcode 6.3 में भी मेरे पास यही मुद्दे थे

  • सुपर धीमी आटोक्लेम्प्टियन
  • सुपर स्लो इंडेक्सिंग
  • तेजी से और SourceKitService द्वारा विशाल CPU उपयोग
  • SourceKitService द्वारा विशाल मेमोरी उपयोग

यह सब अपेक्षाकृत छोटी परियोजना में भी हो रहा था। मैंने उन सभी सुधारों की कोशिश की जो मुझे मिल सकते हैं:

  • हटाना ~ / पुस्तकालय / डेवलपर / Xcode / DerivedData / *
  • हटाना ~ / लाइब्रेरी / कैश / com.apple.dt.Xcode / *
  • कोड से सभी "+" स्ट्रिंग संयोजन निकालें
  • सभी संदिग्ध शब्दकोश घोषणाओं को हटा दिया गया

इनमें से किसी ने भी वास्तव में मेरी परियोजना में मदद नहीं की।

वास्तव में मेरी समस्या का हल क्या था:

  • प्रत्येक वर्ग को अपनी फ़ाइल में प्रत्येक छोर पर रखकर
  • प्रत्येक और हर एक्सटेंशन को अपनी फ़ाइल में रखना (कक्षा + एक्स्टनेम.स्विफ्ट)
  • "क्लास स्विफ्ट मेथड्स" को अपनी फ़ाइल में रखना

अब मेरे पास शून्य CPU उपयोग, कम मेमोरी उपयोग, और शालीनता से तेजी से पूर्णताएं हैं।


2

आम तौर पर, कैश फ़ोल्डर (DerivedData) को SSD ड्राइव पर ले जाना (विशेषकर मेरे मामले में - वज्रपात निकास से जुड़ा एक बाहरी भंडारण) ने नाटकीय रूप से मेरे Xcode प्रदर्शन में सुधार किया है .. संकलन समय और ऐप के आसपास सामान्य सोच लगभग 10 गुना है .. इसके अलावा पूरे git फ़ोल्डर को SSD में स्थानांतरित कर दिया, जिसने नाटकीय रूप से git प्रदर्शन में सुधार किया।


वास्तव में मूल समस्या में मैंने पहले ही अपने मैक को एसएसडी ड्राइव से अपग्रेड कर दिया था और सब कुछ उसी से चला। OS, और अभी भी समस्याएं थीं
mllm

2

XCode 7.2 तक यह एक दर्द था।

Apple ने इसे XCode 7.3 में तय किया और अब यह एक आकर्षण की तरह काम करता है। यह सुपर फास्ट और बहुत अधिक शक्तिशाली है क्योंकि यह फाइलों की अस्पष्ट खोज की तरह थोड़ा काम करता है: आपको वास्तव में प्रस्ताव की सूची में प्रदर्शित होने के लिए विधि / संपत्ति की सटीक शुरुआत टाइप करने की आवश्यकता नहीं है।


2

सभी तरीकों को छोटा करने से थोड़ी मदद मिलती है।

कमांड-अल्टी-शिफ्ट-लेफ्ट एरो करेगा चाल ...

मौजूदा तरीकों को मोड़ने या सामने लाने के लिए या यदि संरचनाएं उपयोग करती हैं:

फोल्ड: कमांड-अल्ट-लेफ्ट एरो

अनफोल्ड: कमांड-अल्ट-राइट एरो


1

SourceKitServiceकोड में टिप्पणियों से निपटने के लिए थोड़े अनाड़ी भी हैं और एम्बेडेड टिप्पणियां इसे धीमा भी करती हैं।

तो अगर आप इस तरह की एम्बेडेड टिप्पणियों की भारी बूँद को हटाने का खर्च उठा सकते हैं:

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

यह निश्चित रूप से भी मदद कर सकता है।


नोट: मेरे मामले में मेरे Xcode 7.3.1 (7D1014) ने मुझे किसी भी पत्र को टाइप करने से वस्तुतः अवरुद्ध कर दिया था जब फ़ाइल में एम्बेडेड टिप्पणियों के साथ लगभग 700 लाइनें थीं। शुरू में मैंने उस .swiftफाइल से उस ब्लॉक को हटा दिया और Xcode फिर से जीवंत हो गया। मैंने एम्बेडेड टिप्पणियों को हटाकर अपनी टिप्पणियों को पीछे के हिस्से में जोड़ने की कोशिश की, यह अभी भी सामान्य से धीमी थी, लेकिन यह बहुत अच्छा प्रदर्शन नहीं दिखा अगर कोई अंतर्निहित टिप्पणियां नहीं थीं।


1

मेरे पास एक ही मुद्दा था जहां टाइपिंग एक विशेष वर्ग में पिछड़ रही थी और यह पता चला

/* Long multiline comments */

टाइपिंग धीमा कर रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.