ฉันยังพบว่ามี CPU + 100% ในขณะที่พิมพ์โค้ด "แบบธรรมดา" เทคนิคเล็ก ๆ น้อย ๆ ที่จะทำให้ตัวแยกวิเคราะห์รวดเร็วเร็วขึ้นด้วยวิธีที่คุณจัดโครงสร้างโค้ดของคุณ
อย่าใช้ตัวเชื่อม "+" ในสตริง สำหรับฉันสิ่งนี้กระตุ้นให้เกิดความช้าเร็วมาก "+" ใหม่แต่ละตัวจะนำตัวแยกวิเคราะห์ไปสู่การรวบรวมข้อมูลและจะต้องแยกวิเคราะห์โค้ดทุกครั้งที่คุณเพิ่มถ่านใหม่ที่ใดที่หนึ่งในเนื้อหาฟังก์ชันของคุณ
แทน:
var str = "This" + String(myArray.count) + " is " + String(someVar)
ใช้เทมเพลต - ไวยากรณ์ซึ่งดูเหมือนจะมีประสิทธิภาพมากกว่าในการแยกวิเคราะห์อย่างรวดเร็ว:
var str = "This \(myArray.count) is \(someVar)"
ด้วยวิธีนี้โดยทั่วไปฉันสังเกตเห็นว่าไม่มีขีด จำกัด ใน strlen ด้วย vars แบบอินไลน์ "\ (*)"
หากคุณมีการคำนวณซึ่งใช้ + / * - ให้แบ่งออกเป็นส่วนย่อย ๆ
แทน:
var result = pi * 2 * radius
ใช้:
var result = pi * 2
result *= radius
อาจดูมีประสิทธิภาพน้อยกว่า แต่ตัวแยกวิเคราะห์ที่รวดเร็วจะเร็วกว่ามากด้วยวิธีนี้ สูตรบางสูตรจะไม่รวบรวมหากต้องดำเนินการหลายอย่างแม้ว่าจะถูกต้องตามหลักคณิตศาสตร์ก็ตาม
หากคุณมีการคำนวณที่ซับซ้อนให้ใส่ไว้ใน func ด้วยวิธีนี้โปรแกรมแยกวิเคราะห์สามารถแยกวิเคราะห์ได้เพียงครั้งเดียวและไม่จำเป็นต้องแยกวิเคราะห์ใหม่ทุกครั้งที่คุณเปลี่ยนแปลงบางสิ่งในเนื้องานของคุณ
เพราะถ้าคุณมีการคำนวณในเนื้อฟังก์ชั่นของคุณตัวแยกวิเคราะห์ที่รวดเร็วจะตรวจสอบทุกครั้งว่าประเภทไวยากรณ์ ฯลฯ ยังคงถูกต้องหรือไม่ หากบรรทัดใดเปลี่ยนแปลงเหนือการคำนวณตัวแปรบางอย่างในการคำนวณ / สูตรของคุณอาจเปลี่ยนแปลงไป หากคุณใส่ไว้ในฟังก์ชันภายนอกจะมีการตรวจสอบความถูกต้องเพียงครั้งเดียวและรวดเร็วยินดีที่จะถูกต้องและไม่แยกวิเคราะห์ใหม่อย่างต่อเนื่องซึ่งทำให้เกิดการใช้งาน CPU สูง
วิธีนี้ทำให้ฉันได้รับจาก 100% ในการกดแต่ละครั้งไปจนถึง CPU ต่ำขณะพิมพ์ ตัวอย่างเช่น 3 บรรทัดนี้ใส่อินไลน์ในเนื้อความฟังก์ชันของคุณสามารถนำ swiftparser ไปสู่การรวบรวมข้อมูล
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 แล้วเรียกมันในภายหลัง swiftparser จะเร็วกว่ามาก
// 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)
}
Swift และ XCode 6.1 ยังคงมีข้อบกพร่องอยู่มาก แต่ถ้าคุณทำตามเทคนิคง่ายๆเหล่านี้การแก้ไขโค้ดจะเป็นที่ยอมรับอีกครั้ง ฉันชอบที่รวดเร็วมากเพราะมันกำจัดไฟล์. h และใช้ไวยากรณ์ที่สะอาดกว่ามาก ยังคงมีความจำเป็นในการคัดเลือกนักแสดงหลายประเภทเช่น "myVar เป็น AnyObject" แต่นั่นเป็นความชั่วร้ายที่เล็กกว่าเมื่อเทียบกับโครงสร้างและไวยากรณ์ของโครงการ Object-c ที่ซับซ้อน
นอกจากนี้ประสบการณ์อื่นฉันลอง SpriteKit ซึ่งใช้งานได้สนุก แต่ค่อนข้างมีประสิทธิภาพหากคุณไม่ต้องการทาสีใหม่ที่ 60fps อย่างต่อเนื่อง การใช้ CALayers แบบเก่าจะดีกว่าสำหรับ CPU มากหาก "สไปรต์" ของคุณไม่ได้เปลี่ยนบ่อยขนาดนั้น หากคุณไม่เปลี่ยน. เนื้อหาของเลเยอร์โดยทั่วไปแล้ว CPU จะไม่ได้ใช้งาน แต่ถ้าคุณมีแอป SpriteKit ที่ทำงานอยู่เบื้องหลังการเล่นวิดีโอในแอปอื่น ๆ อาจเริ่มกระตุกเนื่องจากลูปการอัปเดต 60fps ที่ จำกัด ยาก
บางครั้ง xcode แสดงข้อผิดพลาดแปลก ๆ ในขณะคอมไพล์จากนั้นจะช่วยไปที่เมนู "ผลิตภัณฑ์> ทำความสะอาด" และรวบรวมอีกครั้งดูเหมือนว่าจะเป็นการใช้แคชที่มีข้อบกพร่อง
อีกวิธีที่ดีในการปรับปรุงการแยกเมื่อ Xcode ได้รับการติดอยู่กับรหัสของคุณเป็นที่กล่าวถึงในโพสต์ StackOverflow อีกที่นี่ โดยทั่วไปคุณคัดลอกเนื้อหาทั้งหมดจากไฟล์. swift ของคุณไปยังโปรแกรมแก้ไขภายนอกจากนั้นทำงานโดยฟังก์ชันคัดลอกกลับมาและดูว่าคอขวดของคุณอยู่ที่ใด สิ่งนี้ช่วยให้ฉันได้รับ xcode ด้วยความเร็วที่สมเหตุสมผลอีกครั้งหลังจากที่โครงการของฉันคลั่งไคล้ CPU 100% ในขณะที่คัดลอกโค้ดของคุณกลับคุณสามารถ refactor และพยายามทำให้ function-body ของคุณสั้นและ function / formulars / expression เรียบง่าย (หรือแบ่งเป็นหลายบรรทัด)