मैंने कुछ "सरल" कोड टाइप करते हुए 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 के साथ पागल हो जाने के बाद, मुझे फिर से एक उचित गति प्राप्त करने में मदद करता है। अपने कोड को वापस कॉपी करते समय, आप इसे रीफ़ैक्टर कर सकते हैं और अपने फ़ंक्शन-निकायों को छोटा और फ़ंक्शंस / फ़ॉर्म्यूलर / भाव सरल (या कई लाइनों में विभाजित) रखने की कोशिश कर सकते हैं।