ios - स्विफ्ट सुपर धीमी टाइपिंग और स्वत: पूर्णता के साथ एक्सकोड 6




xcode autocomplete (8)

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

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

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

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

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

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

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

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


एक्सकोड 6.3 में भी मेरे पास एक ही समस्या थी

  • सुपर धीमी स्वतः पूर्णताएं
  • सुपर धीमी इंडेक्सिंग
  • स्विफ्ट और SourceKitService द्वारा भारी CPU उपयोग
  • SourceKitService द्वारा भारी मेमोरी उपयोग

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

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

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

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

  • प्रत्येक वर्ग को प्रत्येक फ़ाइल को अपनी फाइल में रख दें
  • प्रत्येक एक्सटेंशन को अपनी फ़ाइल में रखें (कक्षा + ExtName.swift)
  • अपनी खुद की फाइल में "कक्षा स्विफ्ट विधियों से बाहर" रखना

अब मेरे पास शून्य सीपीयू उपयोग, कम स्मृति उपयोग, और तेजी से तेजी से पूरा होने के करीब है।


ऑटोकॉम्प्लेट को एक्सकोड 4 के बाद टूटा हुआ है। जब तक ऐप्पल इस 2 साल की बग को ठीक करने का फैसला नहीं करता है, दुर्भाग्य से, एकमात्र समाधान, एक्सकोड की वरीयताओं (नीचे तस्वीर का पहला विकल्प) पर कोड पूर्ण होने को बंद करना है।

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

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

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


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

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

के बजाय:

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

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

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

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

इस तरह से टाइपिंग करते समय मुझे प्रत्येक कीप्रेस पर 100% से कम CPU पर मिला। उदाहरण के लिए यह 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 )

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

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

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

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

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

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


मेरे पास एक ही समस्या थी जहां टाइपिंग किसी विशेष वर्ग में लगी हुई थी और उसे बाहर कर दिया गया था

/* Long multiline comments */

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


मैंने पाया कि आम तौर पर तब होता है जब आप:

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

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

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

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


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

इसलिए यदि आप इस तरह की एम्बेडेड टिप्पणियों के बड़े पैमाने पर ब्लॉब को हटा सकते हैं:

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

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

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


  • एक्सकोड छोड़ें और मैक को पुनरारंभ करें आवश्यक नहीं है लेकिन पसंदीदा।
  • फ़ोल्डर ~ / लाइब्रेरी / डेवलपर / एक्सकोड / 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 जोड़ सकते हैं और फिर जब भी आप उन दो फ़ोल्डरों को साफ़ करना चाहते हैं तो कमांड लाइन पर xcodeclean टाइप करें।







xcode6